1
0
Fork 0

Compare commits

..

2 Commits

Author SHA1 Message Date
the-real-herowl a70a0440cd Changed the main menu header and icon 2024-04-22 05:11:05 +02:00
the-real-herowl e155cdc22f Documentation update, mostly rename of the game 2024-04-22 02:53:39 +00:00
40 changed files with 202 additions and 457 deletions

12
API.md
View File

@ -1,10 +1,10 @@
# API # API
## Groups ## Groups
MineClone 2 makes very extensive use of groups. Making sure your items and objects have the correct group memberships is very important. VoxeLibre 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`. Groups are explained in `GROUPS.md`.
## Mod naming convention ## 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. Mods mods in VoxeLibre follow a simple naming convention: Mods with the prefix "`vl_`" and “`mcl_`” are specific to VoxeLibre (formerly known as MineClone2), 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.
## Adding items ## Adding items
### Special fields ### Special fields
@ -31,7 +31,7 @@ All nodes can have these fields:
Use the `mcl_sounds` mod for the sounds. Use the `mcl_sounds` mod for the sounds.
## APIs ## 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/` A lot of things are possible by using one of the APIs in the mods. Many of them are documented in `API.md` files located in the directories of the specific mods. Some use `.txt` files or have some documentation in the comments along the code. 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 ### Items
* Doors: `ITEMS/mcl_doors` * Doors: `ITEMS/mcl_doors`
@ -46,8 +46,7 @@ A lot of things are possible by using one of the APIs in the mods. Note that not
### Mobs ### Mobs
* Mobs: `ENTITIES/mcl_mobs` * Mobs: `ENTITIES/mcl_mobs`
MineClone 2 uses its own mobs framework, called “Mobs Redo: MineClone 2 Edition” or “MRM” for short. VoxeLibre uses its own mobs framework, which is a fork of Mobs Redo [`mobs`] by TenPlus1.
This is a fork of Mobs Redo [`mobs`] by TenPlus1.
You can add your own mobs, spawn eggs and spawning rules with this mod. You can add your own mobs, spawn eggs and spawning rules with this mod.
API documnetation is included in `ENTITIES/mcl_mobs/api.txt`. API documnetation is included in `ENTITIES/mcl_mobs/api.txt`.
@ -68,6 +67,7 @@ chances are good that it works out of the box.
### Utility APIs ### Utility APIs
* Change player physics: `PLAYER/playerphysics` * Change player physics: `PLAYER/playerphysics`
* Change player FOV: `PLAYER/mcl_fovapi`
* Select random treasures: `CORE/mcl_loot` * Select random treasures: `CORE/mcl_loot`
* Get flowing direction of liquids: `CORE/flowlib` * Get flowing direction of liquids: `CORE/flowlib`
* `on_walk_over` callback for nodes: `CORE/walkover` * `on_walk_over` callback for nodes: `CORE/walkover`
@ -77,7 +77,7 @@ chances are good that it works out of the box.
* Flowers and flower pots * Flowers and flower pots
### Unstable APIs ### 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! The following APIs may be subject to change in the 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` * Panes (like glass panes and iron bars): `ITEMS/xpanes`
* `_on_ignite` callback: `ITEMS/mcl_fire` * `_on_ignite` callback: `ITEMS/mcl_fire`

View File

@ -1,21 +1,21 @@
# Contributing to MineClone2 # Contributing to VoxeLibre
So you want to contribute to MineClone2? So you want to contribute to VoxeLibre?
Wow, thank you! :-) Wow, thank you! :-)
MineClone2 is maintained by AncientMariner and Nicu. If you have any VoxeLibre is maintained by AncientMariner and Herowl. If you have any
problems or questions, contact us on Discord/Matrix (See Links section below). problems or questions, contact us on Discord/Matrix (See Links section below).
You can help with MineClone2's development in many different ways, You can help with VoxeLibre's development in many different ways,
whether you're a programmer or not. whether you're a programmer or not.
## MineClone2's development target is to... ## VoxeLibre's development target is to...
- Create a stable, peformant, moddable, free/libre game based on Minecraft - Create a stable, peformant, moddable, free/libre game inspired by Minecraft
using the Minetest engine, usable in both singleplayer and multiplayer. using the Minetest engine, usable in both singleplayer and multiplayer.
- Currently, a lot of features are already implemented. - Currently, a lot of features are already implemented.
Polishing existing features is always welcome. Polishing existing features is always welcome.
## Links ## Links
* [Mesehub](https://git.minetest.land/MineClone2/MineClone2) * [Mesehub](https://git.minetest.land/VoxeLibre/VoxeLibre)
* [Discord](https://discord.gg/xE4z8EEpDC) * [Discord](https://discord.gg/xE4z8EEpDC)
* [YouTube](https://www.youtube.com/channel/UClI_YcsXMF3KNeJtoBfnk9A) * [YouTube](https://www.youtube.com/channel/UClI_YcsXMF3KNeJtoBfnk9A)
* [IRC](https://web.libera.chat/#mineclone2) * [IRC](https://web.libera.chat/#mineclone2)
@ -26,23 +26,23 @@ Polishing existing features is always welcome.
* [OpenCollective](https://opencollective.com/mineclone2) * [OpenCollective](https://opencollective.com/mineclone2)
## Using git ## Using git
MineClone2 is developed using the version control system VoxeLibre is developed using the version control system
[git](https://git-scm.com/). If you want to contribute code to the [git](https://git-scm.com/). If you want to contribute code to the
project, it is **highly recommended** that you learn the git basics. project, it is **highly recommended** that you learn the git basics.
For non-programmers and people who do not plan to contribute code to For non-programmers and people who do not plan to contribute code to
MineClone2, git is not required. However, git is a tool that will be VoxeLibre, git is not required. However, git is a tool that will be
referenced frequently because of its usefulness. As such, it is valuable referenced frequently because of its usefulness. As such, it is valuable
in learning how git works and its terminology. It can also help you in learning how git works and its terminology. It can also help you
keeping your game updated, and easily test pull requests. keeping your game updated, and easily test pull requests.
Look at our wiki for some concrete guides: Look at our wiki for some concrete guides:
https://git.minetest.land/MineClone2/MineClone2/wiki/ https://git.minetest.land/VoxeLibre/VoxeLibre/wiki/
## How you can help as a non-programmer ## How you can help as a non-programmer
As someone who does not know how to write programs in Lua or does not As someone who does not know how to write programs in Lua or does not
know how to use the Minetest API, you can still help us out a lot. For know how to use the Minetest API, you can still help us out a lot. For
example, by opening an issue in the example, by opening an issue in the
[Issue tracker](https://git.minetest.land/MineClone2/MineClone2/issues), [Issue tracker](https://git.minetest.land/VoxeLibre/VoxeLibre/issues),
you can report a bug or request a feature. you can report a bug or request a feature.
### Rules about both bugs and feature requests ### Rules about both bugs and feature requests
@ -75,7 +75,7 @@ in singleplayer, post a screenshot of the message that Minetest showed
when the crash happened (or copy the message into your issue). If you when the crash happened (or copy the message into your issue). If you
are a server admin, you can find error messages in the log file of the are a server admin, you can find error messages in the log file of the
server. server.
* Tell us which MineClone2 and Minetest versions you are using (from Minetest 5.7 type /ver, for previous versions, check the game.conf or README.md file). * Tell us which VoxeLibre and Minetest versions you are using (from Minetest 5.7 type /ver, for previous versions, check the game.conf or README.md file).
* Tell us how to reproduce the problem: What you were doing to trigger * Tell us how to reproduce the problem: What you were doing to trigger
the bug, e.g. before the crash happened or what causes the faulty the bug, e.g. before the crash happened or what causes the faulty
behavior. behavior.
@ -84,14 +84,14 @@ behavior.
* Ensure the requested feature fulfills our development targets and * Ensure the requested feature fulfills our development targets and
goals. goals.
* Begging or excessive attention seeking does not help us in the * Begging or excessive attention seeking does not help us in the
slightest, and may very well disrupt MineClone2 development. It's better slightest, and may very well disrupt VoxeLibre development. It's better
to put that energy into helping or researching the feature in question. to put that energy into helping or researching the feature in question.
After all, we're just volunteers working on our spare time. After all, we're just volunteers working on our spare time.
* Ensure the requested feature has not been implemented in MineClone2 * Ensure the requested feature has not been implemented in VoxeLibre
latest or development versions. latest or development versions.
### Testing code ### Testing code
If you want to help us with speeding up MineClone2 development and If you want to help us with speeding up VoxeLibre development and
making the game more stable, a great way to do that is by testing out making the game more stable, a great way to do that is by testing out
new features from contributors. For most new things that get into the new features from contributors. For most new things that get into the
game, a pull request is created. A pull request is essentially a game, a pull request is created. A pull request is essentially a
@ -103,14 +103,16 @@ tell us if the code works as expected without any issues. Ideally, you
would report issues will pull requests similar to when you were would report issues will pull requests similar to when you were
reporting bugs that are the mainline (See Reporting bugs section). You reporting bugs that are the mainline (See Reporting bugs section). You
can find currently open pull requests here: can find currently open pull requests here:
<https://git.minetest.land/MineClone2/MineClone2/pulls>. Note that pull <https://git.minetest.land/VoxeLibre/VoxeLibre/pulls>. Note that pull
requests that start with a `WIP:` are not done yet and therefore could requests that start with a `WIP:` are not done yet and therefore could
still undergo substantial change. Testing these is still helpful however still undergo substantial change. Testing these is still helpful however
because that is the reason developers put them up as WIP so other people because that is the reason developers put them up as WIP so other people
can have a look at the PR. can have a look at the PR. The wiki has an article with instructions
on how to test Pull Requests:
<https://git.minetest.land/VoxeLibre/VoxeLibre/wiki/Testing-Pull-Requests>.
### Contributing assets ### Contributing assets
Due to license problems, MineClone2 cannot use Minecraft's assets, Due to license problems, VoxeLibre cannot use Minecraft's assets,
therefore we are always looking for asset contributions. therefore we are always looking for asset contributions.
To contribute assets, it can be useful to learn git basics and read To contribute assets, it can be useful to learn git basics and read
@ -128,9 +130,9 @@ If you want to make such contributions, join our Discord server. Demands
for textures will be communicated there. for textures will be communicated there.
#### Sounds #### Sounds
MineClone2 currently does not have a consistent way to handle sounds. VoxeLibre currently does not have a consistent way to handle sounds.
The sounds in the game come from different sources, like the SnowZone The sounds in the game come from different sources, like the SnowZone
resource pack or minetest_game. Unfortunately, MineClone2 does not play resource pack or minetest_game. Unfortunately, VoxeLibre does not play
a sound in every situation you would get one in Minecraft. Any help with a sound in every situation you would get one in Minecraft. Any help with
sounds is greatly appreciated, however if you add new sounds you should sounds is greatly appreciated, however if you add new sounds you should
probably work together with a programmer, to write the code to actually probably work together with a programmer, to write the code to actually
@ -140,7 +142,7 @@ changes made by the contributor. Use the README files in the mod to
communicate this information. communicate this information.
#### 3D Models #### 3D Models
Most of the 3D Models in MineClone2 come from Many of the 3D Models in VoxeLibre come from
[22i's repository](https://github.com/22i/minecraft-voxel-blender-models). [22i's repository](https://github.com/22i/minecraft-voxel-blender-models).
Similar to the textures, we need people that can make 3D Models with Similar to the textures, we need people that can make 3D Models with
Blender on demand. Many of the models have to be patched, some new Blender on demand. Many of the models have to be patched, some new
@ -154,7 +156,7 @@ also be credited in the Contributors section.
### Contributing Translations ### Contributing Translations
#### Workflow #### Workflow
To add/update support for your language to MineClone2, you should take To add/update support for your language to VoxeLibre, you should take
the steps documented in the section for Programmers, add/update the the steps documented in the section for Programmers, add/update the
translation files of the mods that you want to update. You can add translation files of the mods that you want to update. You can add
support for all mods, just some of them or only one mod; you can update support for all mods, just some of them or only one mod; you can update
@ -178,7 +180,7 @@ If you have commited the results yourself, you will also be credited in
the Contributors section. the Contributors section.
### Profiling ### Profiling
If you own a server, a great way to help us improve MineClone2's code If you own a server, a great way to help us improve VoxeLibre's code
is by giving us profiler results. Profiler results give us detailed is by giving us profiler results. Profiler results give us detailed
information about the game's performance and let us know places to information about the game's performance and let us know places to
investigate optimization issues. This way we can make the game faster. investigate optimization issues. This way we can make the game faster.
@ -214,7 +216,7 @@ OpenCollective Funders are credited in their own section in
they have made their donation Incognito). they have made their donation Incognito).
## How you can help as a programmer ## How you can help as a programmer
(Almost) all the MineClone2 development is done using pull requests. (Almost) all the VoxeLibre development is done using pull requests.
### Recommended workflow ### Recommended workflow
* Fork the repository (in case you have not already) * Fork the repository (in case you have not already)
@ -237,11 +239,11 @@ is no issue on the topic, open one. If there is an issue, tell us that
you'd like to take care of it, to avoid duplicate work. you'd like to take care of it, to avoid duplicate work.
### Don't hesitate to ask for help ### Don't hesitate to ask for help
We appreciate any contributing effort to MineClone2. If you are a We appreciate any contributing effort to VoxeLibre. If you are a
relatively new programmer, you can reach us on Discord, Matrix or IRC relatively new programmer, you can reach us on Discord, Matrix or IRC
for questions about git, Lua, Minetest API, MineClone2 codebase or for questions about git, Lua, Minetest API, VoxeLibre codebase or
anything related to MineClone2. We can help you avoid writing code that anything related to VoxeLibre. We can help you avoid writing code that
would be deemed inadequate, or help you become familiar with MineClone2 would be deemed inadequate, or help you become familiar with VoxeLibre
better, or assist you use development tools. better, or assist you use development tools.
### Maintain your own code, even if already got merged ### Maintain your own code, even if already got merged
@ -271,8 +273,8 @@ of the results)
excessive git bureaucracy commits in master) excessive git bureaucracy commits in master)
* We use merge to add the commits from a PR/branch to master * We use merge to add the commits from a PR/branch to master
* Submodules should only be used if a) upstream is highly reliable and * Submodules should only be used if a) upstream is highly reliable and
b) it is 100% certain that no mcl2 specific changes to the code will be b) it is 100% certain that no VL specific changes to the code will be
needed (this has never been the case before, hence mcl2 is submodule free so far) needed (this has never been the case before, hence VL is submodule free so far)
* Commit messages should be descriptive * Commit messages should be descriptive
* Try to group your submissions best as you can: * Try to group your submissions best as you can:
* Try to keep your PRs small: In some cases things reasonably be can't * Try to keep your PRs small: In some cases things reasonably be can't
@ -357,14 +359,14 @@ end
### Developer status ### Developer status
Active and trusted contributors are often granted write access to the Active and trusted contributors are often granted write access to the
MineClone2 repository as a contributor. Those that have demonstrated the right VoxeLibre repository as a contributor. Those that have demonstrated the right
technical skills and behaviours may be granted developer access. These are the technical skills and behaviours may be granted developer access. These are the
most trusted contributors who will contribute to ensure coding standards and most trusted contributors who will contribute to ensure coding standards and
processes are followed. processes are followed.
#### Developer responsibilities #### Developer responsibilities
- If you have developer/contributor privileges you can just open a new branch - If you have developer/contributor privileges you can just open a new branch
in the mcl2 repository (which is preferred). From that you create a pull request. in the VL repository (which is preferred). From that you create a pull request.
This way other people can review your changes and make sure they work This way other people can review your changes and make sure they work
before they get merged. before they get merged.
- If you do not (yet) have developer privs you do your work on a branch - If you do not (yet) have developer privs you do your work on a branch
@ -397,7 +399,7 @@ technical guidelines
#### Release process #### Release process
* Run `tools/generate_ingame_credits.lua` to update the ingame credits * Run `tools/generate_ingame_credits.lua` to update the ingame credits
from `CREDITS.md` and commit the result (if anything changed) from `CREDITS.md` and commit the result (if anything changed)
* Launch MineClone2 to make sure it still runs * Launch VoxeLibre to make sure it still runs
* Update the version number in README.md * Update the version number in README.md
* Use `git tag <version number>` to tag the latest commit with the * Use `git tag <version number>` to tag the latest commit with the
version number version number

View File

@ -25,7 +25,7 @@ The basic digging time groups determine by which tools a node can be dug.
* `handy=1`: Breakable by hand and this node gives it useful drop when dug by hand. All nodes which are breakable by pickaxe, axe, shovel, sword or shears are also automatically breakable by hand, but not neccess * `handy=1`: Breakable by hand and this node gives it useful drop when dug by hand. All nodes which are breakable by pickaxe, axe, shovel, sword or shears are also automatically breakable by hand, but not neccess
* `creative_breakable=1`: Block is breakable by hand in creative mode. This group is implied if the node belongs to any other digging group * `creative_breakable=1`: Block is breakable by hand in creative mode. This group is implied if the node belongs to any other digging group
Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times work in Minecraft, as MineClone 2 is based on the same system. Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times work in Minecraft, as VoxeLibre is based on the same system.
### Groups for interactions ### Groups for interactions
@ -117,7 +117,7 @@ These groups correspond to the Minecraft materials. They classify the block into
* `material_glass=1`: Glass * `material_glass=1`: Glass
Currently, these groups are used for the note block. Currently, these groups are used for the note block.
Note that not all Minecraft materials are used so far. More Minecraft materials will lilely only be added when they are needed for a concrete use case. Note that not all Minecraft materials are used so far. More Minecraft materials will likely only be added when they are needed for a concrete use case.
### Declarative groups ### Declarative groups
These groups are used mostly for informational purposes These groups are used mostly for informational purposes

View File

@ -6,15 +6,15 @@ How to play:
- Navigate to https://www.minetest.net/ to download the client. - Navigate to https://www.minetest.net/ to download the client.
- Once installed, open and select the "Content" tab - Once installed, open and select the "Content" tab
#### Install MineClone2 from ContentDB #### Install VoxeLibre from ContentDB
- Click "Browse Online Content" and filter by Games (select "Games" from the dropdown box) - Click "Browse Online Content" and filter by Games (select "Games" from the dropdown box)
- Find "MineClone2" (should be first on the list or on the first page) - Find "VoxeLibre" (should be first on the list or on the first page)
- Click the [+] button next to MineClone2 and wait for download to finish - Click the [+] button next to VoxeLibre and wait for download to finish
- Click "Back to Main Menu" - Click "Back to Main Menu"
#### Create new world and play #### Create new world and play
- Click "Start Game" tab - Click "Start Game" tab
- At the bottom click the MineClone2 icon (the 2 dirt with grass blocks) - At the bottom click the VoxeLibre icon (the 2 dirt with grass blocks)
- Click "New", give your world a name - Click "New", give your world a name
- You can leave seed blank or put in a word of your choice - You can leave seed blank or put in a word of your choice
- Select your new world - Select your new world

View File

@ -1,14 +1,14 @@
# Legal information # Legal information
This is a fan game, not developed or endorsed by Mojang AB. This is a game inspired by Minecraft with unique content.
Copying is an act of love. Please copy and share! <3 Copying is an act of love. Please copy and share! <3
Here's the detailed legalese for those who need it: Here's the detailed legalese for those who need it:
## License of source code ## License of source code
MineClone 2 (by Lizzy Fleckenstein, Wuzzy, davedevils and countless others) VoxeLibre (by Lizzy Fleckenstein, Wuzzy, davedevils and countless others)
is an imitation of Minecraft. is inspired by Minecraft.
MineClone 2 is free software: you can redistribute it and/or modify VoxeLibre is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
@ -22,15 +22,15 @@ details.
In the mods you might find in the read-me or license In the mods you might find in the read-me or license
text files a different license. This counts as dual-licensing. text files a different license. This counts as dual-licensing.
You can choose which license applies to you: Either the You can choose which license applies to you: Either the
license of MineClone 2 (GNU GPLv3) or the mod's license. license of VoxeLibre (GNU GPLv3) or the mod's license.
MineClone 2 is a direct continuation of the discontinued MineClone VoxeLibre is a direct continuation of the discontinued MineClone
project by davedevils. project by davedevils.
Mod credits: Mod credits:
See `README.txt` or `README.md` in each mod directory for information about other authors. 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 For mods that do not have such a file, the license is the source code license
of MineClone 2 and the author is Wuzzy. of VoxeLibre and the author is Wuzzy.
## License of media (textures and sounds) ## License of media (textures and sounds)
No non-free licenses are used anywhere. No non-free licenses are used anywhere.

View File

@ -1,10 +1,10 @@
# Models in Minetest/Mineclone2 # Models in Minetest/VoxeLibre
Models are an important part of all entities & unique nodes in Mineclone2. They provide a 3 dimensional map of an object for which textures are then applied to. This document is for modders, it quickly highlights some important information for the software needed to open models in Mineclone2. Models are an important part of all entities & unique nodes in VoxeLibre. They provide a 3 dimensional map of an object for which textures are then applied to. This document is for modders, it quickly highlights some important information for the software needed to open models in VoxeLibre.
## Minetest Wiki ## Minetest Wiki
For more detailed information on actually using blender to create and modify models for Minetest/Mineclone2, please visit the Minetest wiki's page on using Blender [Here](https://wiki.minetest.net/Using_Blender) For more detailed information on actually using blender to create and modify models for Minetest/VoxeLibre, please visit the Minetest wiki's page on using Blender [Here](https://wiki.minetest.net/Using_Blender)
## Recommended software ## Recommended software

View File

@ -1,6 +1,6 @@
# MineClone2 # VoxeLibre
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. A game inspired by Minecraft for Minetest. Forked from MineClone by davedevils.
Developed by many people. Not developed or endorsed by Mojang AB. Developed by many people, see CREDITS.md for a complete list.
### Gameplay ### Gameplay
You start in a randomly-generated world made entirely of cubes. You can explore You start in a randomly-generated world made entirely of cubes. You can explore
@ -67,16 +67,16 @@ an explanation.
This game requires [Minetest](http://minetest.net) to run (version 5.4.1 or This game requires [Minetest](http://minetest.net) to run (version 5.4.1 or
later). So you need to install Minetest first. Only stable versions of Minetest later). So you need to install Minetest first. Only stable versions of Minetest
are officially supported. are officially supported.
There is no support for running MineClone2 in development versions of Minetest. There is no support for running VoxeLibre in development versions of Minetest.
To install MineClone2 (if you haven't already), move this directory into the To install VoxeLibre (if you haven't already), move this directory into the
“games” directory of your Minetest data directory. Consult the help of “games” directory of your Minetest data directory. Consult the help of
Minetest to learn more. Minetest to learn more.
## Useful links ## Useful links
The MineClone2 repository is hosted at Mesehub. To contribute or report issues, head there. The VoxeLibre repository is hosted at Mesehub. To contribute or report issues, head there.
* Mesehub: <https://git.minetest.land/MineClone2/MineClone2> * Mesehub: <https://git.minetest.land/VoxeLibre/VoxeLibre>
* Discord: <https://discord.gg/xE4z8EEpDC> * Discord: <https://discord.gg/xE4z8EEpDC>
* YouTube: <https://www.youtube.com/channel/UClI_YcsXMF3KNeJtoBfnk9A> * YouTube: <https://www.youtube.com/channel/UClI_YcsXMF3KNeJtoBfnk9A>
* ContentDB: <https://content.minetest.net/packages/wuzzy/mineclone2/> * ContentDB: <https://content.minetest.net/packages/wuzzy/mineclone2/>
@ -104,7 +104,7 @@ well on really low spec computers.
This game is currently in **beta** stage. This game is currently in **beta** stage.
It is playable, but not yet feature-complete. It is playable, but not yet feature-complete.
Backwards-compability is not entirely guaranteed, updating your world might cause small bugs. Backwards-compability is not entirely guaranteed, updating your world might cause small bugs.
If you want to use the development version of MineClone2 in production, the master branch is usually relatively stable. If you want to use the development version of VoxeLibre in production, the master branch is usually relatively stable.
The following main features are available: The following main features are available:
@ -187,7 +187,7 @@ Technical differences from Minecraft:
* Different engine (Minetest) * Different engine (Minetest)
* Different easter eggs * Different easter eggs
… and finally, MineClone2 is free software (“free” as in “freedom”)! … and finally, VoxeLibre is free software (“free” as in “freedom”)!
## Other readme files ## Other readme files

View File

@ -69,7 +69,7 @@ Note: If you have to do more than 1 hotfix release, can do it on the same releas
### Release via ContentDB ### Release via ContentDB
* Go to MineClone2 page (https://content.minetest.net/packages/Wuzzy/mineclone2/) * Go to VoxeLibre page (https://content.minetest.net/packages/Wuzzy/mineclone2/)
* Click +Release * Click +Release
* Enter the release tag number in the title and Git reference box. For example (without quotes): "0.82.1" * Enter the release tag number in the title and Git reference box. For example (without quotes): "0.82.1"
* In the minimum minetest version, put the oldest supported version (as of 14/02/2023 it is 5.5), leave the Maximum minetest version blank * In the minimum minetest version, put the oldest supported version (as of 14/02/2023 it is 5.5), leave the Maximum minetest version blank

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -257,21 +257,12 @@ end
---@param dst_inventory InvRef Destination inventory to push to ---@param dst_inventory InvRef Destination inventory to push to
---@param dst_list string Name of destination inventory list to push to ---@param dst_list string Name of destination inventory list to push to
---@param condition? fun(stack: ItemStack) Condition which items are allowed to be transfered. ---@param condition? fun(stack: ItemStack) Condition which items are allowed to be transfered.
---@param count? integer Number of items to try to transfer at once
---@return integer Item stack number to be transfered ---@return integer Item stack number to be transfered
function mcl_util.select_stack(src_inventory, src_list, dst_inventory, dst_list, condition, count) function mcl_util.select_stack(src_inventory, src_list, dst_inventory, dst_list, condition)
local src_size = src_inventory:get_size(src_list) local src_size = src_inventory:get_size(src_list)
local stack local stack
for i = 1, src_size do for i = 1, src_size do
stack = src_inventory:get_stack(src_list, i) stack = src_inventory:get_stack(src_list, i)
-- Allow for partial stack movement
if count and stack:get_count() >= count then
local new_stack = ItemStack(stack)
new_stack:set_count(count)
stack = new_stack
end
if not stack:is_empty() and dst_inventory:room_for_item(dst_list, stack) and ((condition == nil or condition(stack))) then if not stack:is_empty() and dst_inventory:room_for_item(dst_list, stack) and ((condition == nil or condition(stack))) then
return i return i
end end
@ -289,13 +280,9 @@ end
-- Returns true on success and false on failure -- Returns true on success and false on failure
-- Possible failures: No item in source slot, destination inventory full -- Possible failures: No item in source slot, destination inventory full
function mcl_util.move_item(source_inventory, source_list, source_stack_id, destination_inventory, destination_list) function mcl_util.move_item(source_inventory, source_list, source_stack_id, destination_inventory, destination_list)
-- Can't move items we don't have if not source_inventory:is_empty(source_list) then
if source_inventory:is_empty(source_list) then return false end
-- Can't move from an empty stack
local stack = source_inventory:get_stack(source_list, source_stack_id) local stack = source_inventory:get_stack(source_list, source_stack_id)
if stack:is_empty() then return false end if not stack:is_empty() then
local new_stack = ItemStack(stack) local new_stack = ItemStack(stack)
new_stack:set_count(1) new_stack:set_count(1)
if not destination_inventory:room_for_item(destination_list, new_stack) then if not destination_inventory:room_for_item(destination_list, new_stack) then
@ -305,6 +292,9 @@ function mcl_util.move_item(source_inventory, source_list, source_stack_id, dest
source_inventory:set_stack(source_list, source_stack_id, stack) source_inventory:set_stack(source_list, source_stack_id, stack)
destination_inventory:add_item(destination_list, new_stack) destination_inventory:add_item(destination_list, new_stack)
return true return true
end
end
return false
end end
--- Try pushing item from hopper inventory to destination inventory --- Try pushing item from hopper inventory to destination inventory
@ -324,23 +314,25 @@ function mcl_util.hopper_push(pos, dst_pos)
local dst_list = 'main' local dst_list = 'main'
local dst_inv, stack_id local dst_inv, stack_id
-- Find a inventory stack in the destination
if dst_def._mcl_hoppers_on_try_push then if dst_def._mcl_hoppers_on_try_push then
dst_inv, dst_list, stack_id = dst_def._mcl_hoppers_on_try_push(dst_pos, pos, hop_inv, hop_list) dst_inv, dst_list, stack_id = dst_def._mcl_hoppers_on_try_push(dst_pos, pos, hop_inv, hop_list)
else else
local dst_meta = minetest.get_meta(dst_pos) local dst_meta = minetest.get_meta(dst_pos)
dst_inv = dst_meta:get_inventory() dst_inv = dst_meta:get_inventory()
stack_id = mcl_util.select_stack(hop_inv, hop_list, dst_inv, dst_list, nil, 1) stack_id = mcl_util.select_stack(hop_inv, hop_list, dst_inv, dst_list)
end end
if not stack_id then return false end
-- Move the item if stack_id ~= nil then
local ok = mcl_util.move_item(hop_inv, hop_list, stack_id, dst_inv, dst_list) local ok = mcl_util.move_item(hop_inv, hop_list, stack_id, dst_inv, dst_list)
if dst_def._mcl_hoppers_on_after_push then if dst_def._mcl_hoppers_on_after_push then
dst_def._mcl_hoppers_on_after_push(dst_pos) dst_def._mcl_hoppers_on_after_push(dst_pos)
end end
if ok then
return true
end
end
return ok return false
end end
-- Try pulling from source inventory to hopper inventory -- Try pulling from source inventory to hopper inventory
@ -365,7 +357,7 @@ function mcl_util.hopper_pull(pos, src_pos)
else else
local src_meta = minetest.get_meta(src_pos) local src_meta = minetest.get_meta(src_pos)
src_inv = src_meta:get_inventory() src_inv = src_meta:get_inventory()
stack_id = mcl_util.select_stack(src_inv, src_list, hop_inv, hop_list, nil, 1) stack_id = mcl_util.select_stack(src_inv, src_list, hop_inv, hop_list)
end end
if stack_id ~= nil then if stack_id ~= nil then

View File

@ -168,7 +168,7 @@ end
function boat.on_activate(self, staticdata, dtime_s) function boat.on_activate(self, staticdata, dtime_s)
self.object:set_armor_groups({fleshy = 125}) self.object:set_armor_groups({fleshy = 100})
local data = minetest.deserialize(staticdata) local data = minetest.deserialize(staticdata)
if type(data) == "table" then if type(data) == "table" then
self._v = data.v self._v = data.v

View File

@ -1989,17 +1989,6 @@ local trade_inventory = {
-- Otherwise, 20% chance to unlock if used freshly reset trade -- Otherwise, 20% chance to unlock if used freshly reset trade
unlock_stuff = true unlock_stuff = true
end end
-- calculate xp based on the price
local emeralds = 0
if wanted1:get_name() == "mcl_core:emerald" then
emeralds = wanted1:get_count()
elseif wanted2:get_name() == "mcl_core:emerald" then
emeralds = wanted2:get_count()
else
local offered = inv:get_stack("offered", 1)
emeralds = offered:get_name() == "mcl_core:emerald" and offered:get_count() or 0
end
local xp = 2 + math.ceil(emeralds / (64/4)) -- 1..64 emeralds = 3..6 xp
local update_formspec = false local update_formspec = false
if unlock_stuff then if unlock_stuff then
-- First-time trade unlock all trades and unlock next trade tier -- First-time trade unlock all trades and unlock next trade tier
@ -2011,7 +2000,6 @@ local trade_inventory = {
set_textures(trader) set_textures(trader)
update_max_tradenum(trader) update_max_tradenum(trader)
update_formspec = true update_formspec = true
xp = xp + 5
end end
for t=1, #trades do for t=1, #trades do
trades[t].locked = false trades[t].locked = false
@ -2022,7 +2010,6 @@ local trade_inventory = {
-- TODO: Replace by Regeneration I -- TODO: Replace by Regeneration I
trader.health = math.min(trader.hp_max, trader.health + 4) trader.health = math.min(trader.hp_max, trader.health + 4)
end end
mcl_experience.add_xp(player, xp)
trade.trade_counter = trade.trade_counter + 1 trade.trade_counter = trade.trade_counter + 1
mcl_log("Trade counter is: ".. trade.trade_counter) mcl_log("Trade counter is: ".. trade.trade_counter)
-- Semi-randomly lock trade for repeated trade (not if there's only 1 trade) -- Semi-randomly lock trade for repeated trade (not if there's only 1 trade)
@ -2060,7 +2047,6 @@ local trade_inventory = {
if update_formspec then if update_formspec then
show_trade_formspec(name, trader, tradenum) show_trade_formspec(name, trader, tradenum)
end end
else else
minetest.log("error", "[mobs_mc] Player took item from trader output but player_trading_with or player_tradenum is nil!") minetest.log("error", "[mobs_mc] Player took item from trader output but player_trading_with or player_tradenum is nil!")
end end

View File

@ -76,7 +76,6 @@ function tt.reload_itemstack_description(itemstack)
orig_desc = minetest.colorize(tt.NAME_COLOR, meta:get_string("name")) orig_desc = minetest.colorize(tt.NAME_COLOR, meta:get_string("name"))
end end
local desc = apply_snippets(orig_desc, itemstring, toolcaps or def.tool_capabilities, itemstack) local desc = apply_snippets(orig_desc, itemstring, toolcaps or def.tool_capabilities, itemstack)
if desc == def.description and meta:get_string("description") == "" then return end
meta:set_string("description", desc) meta:set_string("description", desc)
end end
end end

View File

@ -204,8 +204,7 @@ local function init(player)
local playername = player:get_player_name() local playername = player:get_player_name()
minetest.create_detached_inventory("creative_" .. playername, { minetest.create_detached_inventory("creative_" .. playername, {
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
if minetest.is_creative_enabled(playername) and if minetest.is_creative_enabled(playername) then
from_list ~= to_list then
return count return count
else else
return 0 return 0
@ -542,6 +541,7 @@ function mcl_inventory.set_creative_formspec(player)
"style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=;noclip=true]", "style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=;noclip=true]",
"image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]", "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]",
"item_image_button[" .. boffset[this_tab] .. ";1,1;" .. tab_icon[this_tab] .. ";" .. this_tab .. ";]", "item_image_button[" .. boffset[this_tab] .. ";1,1;" .. tab_icon[this_tab] .. ";" .. this_tab .. ";]",
"tooltip[blocks;" .. F(filtername[this_tab]) .. "]"
}) })
end end
@ -570,33 +570,20 @@ function mcl_inventory.set_creative_formspec(player)
listrings, listrings,
tab(name, "blocks") .. tab(name, "blocks"),
"tooltip[blocks;"..F(filtername["blocks"]).."]".. tab(name, "deco"),
tab(name, "deco") .. tab(name, "redstone"),
"tooltip[deco;"..F(filtername["deco"]).."]".. tab(name, "rail"),
tab(name, "redstone") .. tab(name, "misc"),
"tooltip[redstone;"..F(filtername["redstone"]).."]".. tab(name, "nix"),
tab(name, "rail") ..
"tooltip[rail;"..F(filtername["rail"]).."]"..
tab(name, "misc") ..
"tooltip[misc;"..F(filtername["misc"]).."]"..
tab(name, "nix") ..
"tooltip[nix;"..F(filtername["nix"]).."]"..
tab(name, "food") .. tab(name, "food"),
"tooltip[food;"..F(filtername["food"]).."]".. tab(name, "tools"),
tab(name, "tools") .. tab(name, "combat"),
"tooltip[tools;"..F(filtername["tools"]).."]".. tab(name, "mobs"),
tab(name, "combat") .. tab(name, "brew"),
"tooltip[combat;"..F(filtername["combat"]).."]".. tab(name, "matr"),
tab(name, "mobs") .. tab(name, "inv"),
"tooltip[mobs;"..F(filtername["mobs"]).."]"..
tab(name, "brew") ..
"tooltip[brew;"..F(filtername["brew"]).."]"..
tab(name, "matr") ..
"tooltip[matr;"..F(filtername["matr"]).."]"..
tab(name, "inv") ..
"tooltip[inv;"..F(filtername["inv"]).."]"
}) })
if name == "nix" then if name == "nix" then
@ -607,7 +594,6 @@ function mcl_inventory.set_creative_formspec(player)
formspec = formspec .. table.concat({ formspec = formspec .. table.concat({
"field[5.325,0.15;6.1,0.6;search;;" .. minetest.formspec_escape(filter) .. "]", "field[5.325,0.15;6.1,0.6;search;;" .. minetest.formspec_escape(filter) .. "]",
"field_close_on_enter[search;false]", "field_close_on_enter[search;false]",
"field_enter_after_edit[search;true]",
"set_focus[search;true]", "set_focus[search;true]",
}) })
end end

View File

@ -77,31 +77,16 @@ local function rotate(pos, node, user, mode, new_param2)
end end
local creative_dig = {}
local function destruct_bed(pos, oldnode) local function destruct_bed(pos, oldnode)
local node = oldnode or minetest_get_node_or_nil(pos) local node = oldnode or minetest_get_node_or_nil(pos)
if not node then return end if not node then return end
local pos2, node2, bottom = get_bed_next_node(pos, oldnode) local pos2, node2, bottom = get_bed_next_node(pos, oldnode)
-- Check creative dig flags and don't drop an item if the bed was dug by a player in
-- creative mode
local pos_hash = minetest.hash_node_position(pos)
local pos2_hash = minetest.hash_node_position(pos2)
local creative_mode = creative_dig[pos_hash] or creative_dig[pos2_hash]
if bottom then if bottom then
if node2 and string.sub(node2.name, -4) == "_top" then if node2 and string.sub(node2.name, -4) == "_top" then
minetest_remove_node(pos2) minetest_remove_node(pos2)
end end
-- Drop the bed only when removing the top to prevent duplication and only if
-- it wasn't dug by a player in creative mode
local bed_node_def = minetest.registered_nodes[node.name]
if bed_node_def and bed_node_def._mcl_beds_drop and not creative_mode then
local stack = ItemStack(bed_node_def._mcl_beds_drop)
minetest.add_item(pos2, stack)
end
else else
if node2 and string.sub(node2.name, -7) == "_bottom" then if node2 and string.sub(node2.name, -7) == "_bottom" then
minetest_remove_node(pos2) minetest_remove_node(pos2)
@ -109,29 +94,6 @@ local function destruct_bed(pos, oldnode)
end end
end end
local function dig_bed(pos, node, digger)
local pos_hash = minetest.hash_node_position(pos)
if digger then
local name = digger:get_player_name()
if minetest.is_protected(pos, name) then
minetest.record_protection_violation(pos, name)
return
end
-- Set creative dig flags to stop dropping items
if minetest.is_creative_enabled(name) then
creative_dig[pos_hash] = true
end
end
-- Trigger the destruct_bed function
minetest.remove_node(pos)
-- Clean up creative dig flag
creative_dig[pos_hash] = nil
end
local function kick_player_after_destruct(destruct_pos) local function kick_player_after_destruct(destruct_pos)
for name, player_bed_pos in pairs(mcl_beds.bed_pos) do for name, player_bed_pos in pairs(mcl_beds.bed_pos) do
if vector.distance(destruct_pos, player_bed_pos) < 0.1 then if vector.distance(destruct_pos, player_bed_pos) < 0.1 then
@ -164,26 +126,6 @@ if minetest.get_modpath("mcl_sounds") then
}) })
end end
local function place_bed(name, placer, pos, dir)
local botpos = vector_add(pos, minetest_facedir_to_dir(dir))
if minetest.is_protected(botpos, placer:get_player_name()) and
not minetest.check_player_privs(placer, "protection_bypass") then
minetest.record_protection_violation(botpos, placer:get_player_name())
return false
end
local botdef = minetest.registered_nodes[minetest_get_node(botpos).name]
if not botdef or not botdef.buildable_to then
return false
end
minetest.set_node(pos, {name = name .. "_bottom", param2 = dir})
minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
return true
end
function mcl_beds.register_bed(name, def) function mcl_beds.register_bed(name, def)
local common_box = { local common_box = {
type = "fixed", type = "fixed",
@ -214,8 +156,7 @@ function mcl_beds.register_bed(name, def)
sounds = def.sounds or default_sounds, sounds = def.sounds or default_sounds,
selection_box = common_box, selection_box = common_box,
collision_box = common_box, collision_box = common_box,
_mcl_beds_drop = def.recipe and name or "", drop = def.recipe and name or "",
drop = "",
node_placement_prediction = "", node_placement_prediction = "",
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
@ -248,23 +189,30 @@ function mcl_beds.register_bed(name, def)
return itemstack return itemstack
end end
-- Try to place in three directions: inline with the view and rotated to
-- the right and left
local dir = minetest.dir_to_facedir(placer:get_look_dir()) local dir = minetest.dir_to_facedir(placer:get_look_dir())
if place_bed(name, placer, pos, dir) or local botpos = vector_add(pos, minetest_facedir_to_dir(dir))
place_bed(name, placer, pos, (dir+1)%4) or
place_bed(name, placer, pos, (dir+3)%4) or if minetest.is_protected(botpos, placer:get_player_name()) and
place_bed(name, placer, pos, (dir+2)%4) then not minetest.check_player_privs(placer, "protection_bypass") then
-- Bed was places minetest.record_protection_violation(botpos, placer:get_player_name())
return itemstack
end
local botdef = minetest.registered_nodes[minetest_get_node(botpos).name]
if not botdef or not botdef.buildable_to then
return itemstack
end
minetest.set_node(pos, {name = name .. "_bottom", param2 = dir})
minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
if not minetest.is_creative_enabled(placer:get_player_name()) then if not minetest.is_creative_enabled(placer:get_player_name()) then
itemstack:take_item() itemstack:take_item()
end end
end
return itemstack return itemstack
end, end,
after_destruct = destruct_bed, after_destruct = destruct_bed,
on_dig = dig_bed,
on_destruct = kick_player_after_destruct, on_destruct = kick_player_after_destruct,
@ -291,7 +239,7 @@ function mcl_beds.register_bed(name, def)
_mcl_hardness = 0.2, _mcl_hardness = 0.2,
_mcl_blast_resistance = 1, _mcl_blast_resistance = 1,
sounds = def.sounds or default_sounds, sounds = def.sounds or default_sounds,
drop = "", drop = def.recipe and name or "",
selection_box = common_box, selection_box = common_box,
collision_box = common_box, collision_box = common_box,
@ -302,7 +250,6 @@ function mcl_beds.register_bed(name, def)
on_rotate = rotate, on_rotate = rotate,
after_destruct = destruct_bed, after_destruct = destruct_bed,
on_dig = dig_bed,
}) })
minetest.register_alias(name, name .. "_bottom") minetest.register_alias(name, name .. "_bottom")

View File

@ -191,18 +191,6 @@ minetest.register_craft({
}, },
}) })
minetest.register_craft({
type = "fuel",
recipe = "group:bee_nest",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = "group:beehive",
burntime = 15,
})
-- Temporary ABM to update honey levels -- Temporary ABM to update honey levels
minetest.register_abm({ minetest.register_abm({
label = "Update Beehive Honey Levels", label = "Update Beehive Honey Levels",

View File

@ -475,11 +475,8 @@ minetest.register_node("mcl_books:bookshelf", {
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local function filter(stack) return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main",
return minetest.get_item_group(stack:get_name(), "book") == 1 or function(stack) return minetest.get_item_group(stack:get_name(), "book") == 1 or stack:get_name() == "mcl_enchanting:book_enchanted" end)
stack:get_name() == "mcl_enchanting:book_enchanted"
end
return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", filter, 1)
end, end,
}) })

View File

@ -379,27 +379,16 @@ end
local function hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list) local function hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then
if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) return inv, "input", mcl_util.select_stack(hop_inv, hop_list, inv, "input",
then function(stack) return minetest.get_item_group(stack:get_name(), "brewitem") == 1 and minetest.get_item_group(stack:get_name(), "bottle") == 0 end)
local function filter(stack)
return minetest.get_item_group(stack:get_name(), "brewitem") == 1 and
minetest.get_item_group(stack:get_name(), "bottle") == 0
end
return inv, "input", mcl_util.select_stack(hop_inv, hop_list, inv, "input", filter, 1)
else else
local filter = function(stack) local stack = mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", function(stack) return stack:get_name() == "mcl_mobitems:blaze_powder" end)
return stack:get_name() == "mcl_mobitems:blaze_powder"
end
local stack = mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", filter, 1 )
if stack then if stack then
return inv, "fuel", stack return inv, "fuel", stack
else else
local function filter(stack) return inv, "stand", mcl_util.select_stack(hop_inv, hop_list, inv, "stand",
return minetest.get_item_group(stack:get_name(), "bottle") == 1 function(stack) return minetest.get_item_group(stack:get_name(), "bottle") == 1 end)
end
return inv, "stand", mcl_util.select_stack(hop_inv, hop_list, inv, "stand", filter, 1)
end end
end end
end end

View File

@ -26,9 +26,3 @@ minetest.register_craft({
{ "group:wood", "group:wood", "" }, { "group:wood", "group:wood", "" },
} }
}) })
minetest.register_craft({
type = "fuel",
recipe = "mcl_cartography_table:cartography_table",
burntime = 15,
})

View File

@ -760,7 +760,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main", nil, 1) local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main")
if stack_id ~= nil then if stack_id ~= nil then
return inv, "main", stack_id return inv, "main", stack_id
end end
@ -768,7 +768,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
local meta_other = minetest.get_meta(pos_other) local meta_other = minetest.get_meta(pos_other)
local inv_other = meta_other:get_inventory() local inv_other = meta_other:get_inventory()
stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main", nil, 1) stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main")
return inv_other, "main", stack_id return inv_other, "main", stack_id
end, end,
}) })
@ -955,13 +955,13 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
local meta_other = minetest.get_meta(pos_other) local meta_other = minetest.get_meta(pos_other)
local inv_other = meta_other:get_inventory() local inv_other = meta_other:get_inventory()
local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main", nil, 1) local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main")
if stack_id ~= nil then if stack_id ~= nil then
return inv_other, "main", stack_id return inv_other, "main", stack_id
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main", nil, 1) stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main")
return inv, "main", stack_id return inv, "main", stack_id
end, end,
}) })
@ -1522,7 +1522,7 @@ for color, desc in pairs(boxtypes) do
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", mcl_chests.is_not_shulker_box, 1) return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", mcl_chests.is_not_shulker_box)
end, end,
}) })

View File

@ -238,7 +238,7 @@ minetest.register_node("mcl_composters:composter", {
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition, 1) return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition)
end, end,
_mcl_hoppers_on_after_push = function(pos) _mcl_hoppers_on_after_push = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -293,7 +293,7 @@ local function register_filled_composter(level)
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition, 1) return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition)
end, end,
_mcl_hoppers_on_after_push = function(pos) _mcl_hoppers_on_after_push = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)

View File

@ -164,12 +164,6 @@ minetest.register_node("mcl_core:deadbush", {
_mcl_hardness = 0, _mcl_hardness = 0,
}) })
minetest.register_craft({
type = "fuel",
recipe = "mcl_core:deadbush",
burntime = 5,
})
minetest.register_node("mcl_core:barrier", { minetest.register_node("mcl_core:barrier", {
description = S("Barrier"), description = S("Barrier"),
_doc_items_longdesc = S("Barriers are invisible 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_longdesc = S("Barriers are invisible 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."),

View File

@ -74,7 +74,6 @@ local end_rod_def = {
light_source = minetest.LIGHT_MAX, light_source = minetest.LIGHT_MAX,
sunlight_propagates = true, sunlight_propagates = true,
groups = { dig_immediate=3, deco_block=1, destroy_by_lava_flow=1, end_rod=1 }, groups = { dig_immediate=3, deco_block=1, destroy_by_lava_flow=1, end_rod=1 },
use_texture_alpha = "clip",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
@ -154,7 +153,6 @@ for num, row in ipairs(colored_end_rods) do
def.description = desc def.description = desc
def._doc_items_longdesc = nil def._doc_items_longdesc = nil
def._doc_items_create_entry = false def._doc_items_create_entry = false
def.use_texture_alpha = "clip"
local side_tex local side_tex
if name == "pink" then if name == "pink" then
def.tiles[1] = def.tiles[1] .. "^(" .. def.tiles[1] .. end_rod_mask .. "^[multiply:" .. name .. "^[hsl:0:300)" def.tiles[1] = def.tiles[1] .. "^(" .. def.tiles[1] .. end_rod_mask .. "^[multiply:" .. name .. "^[hsl:0:300)"

View File

@ -24,9 +24,3 @@ minetest.register_craft({
{ "group:wood", "group:wood", "" }, { "group:wood", "group:wood", "" },
} }
}) })
minetest.register_craft({
type = "fuel",
recipe = "mcl_fletching_table:fletching_table",
burntime = 15,
})

View File

@ -195,7 +195,6 @@ def_clover.tiles = { "mcl_flowers_clover.png" }
def_clover.inventory_image = "mcl_flowers_clover_inv.png" def_clover.inventory_image = "mcl_flowers_clover_inv.png"
def_clover.wield_image = "mcl_flowers_clover_inv.png" def_clover.wield_image = "mcl_flowers_clover_inv.png"
def_clover.drop = nil def_clover.drop = nil
def_clover.use_texture_alpha = "clip"
def_clover.selection_box = { def_clover.selection_box = {
type = "fixed", type = "fixed",
fixed = { -4/16, -0.5, -4/16, 4/16, 0, 4/16 }, fixed = { -4/16, -0.5, -4/16, 4/16, 0, 4/16 },
@ -211,7 +210,6 @@ def_4l_clover.mesh = "mcl_clover_4leaf.obj"
def_4l_clover.tiles = { "mcl_flowers_fourleaf_clover.png" } def_4l_clover.tiles = { "mcl_flowers_fourleaf_clover.png" }
def_4l_clover.inventory_image = "mcl_flowers_fourleaf_clover_inv.png" def_4l_clover.inventory_image = "mcl_flowers_fourleaf_clover_inv.png"
def_4l_clover.wield_image = "mcl_flowers_fourleaf_clover_inv.png" def_4l_clover.wield_image = "mcl_flowers_fourleaf_clover_inv.png"
def_4l_clover.use_texture_alpha = "clip"
minetest.register_node("mcl_flowers:fourleaf_clover", def_4l_clover) minetest.register_node("mcl_flowers:fourleaf_clover", def_4l_clover)
@ -270,7 +268,6 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
end end
-- Sunflower mesh and tiles -- Sunflower mesh and tiles
local top_drawtype, bottom_drawtype local top_drawtype, bottom_drawtype
local alpha = nil
local bottom_tiles = {} local bottom_tiles = {}
if not mesh then if not mesh then
top_drawtype = "plantlike" top_drawtype = "plantlike"
@ -280,7 +277,6 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
top_drawtype = "airlike" top_drawtype = "airlike"
bottom_drawtype = "mesh" bottom_drawtype = "mesh"
bottom_tiles = bottom_img bottom_tiles = bottom_img
alpha = "clip"
end end
-- Bottom -- Bottom
minetest.register_node("mcl_flowers:"..name, { minetest.register_node("mcl_flowers:"..name, {
@ -302,7 +298,6 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
_mcl_shears_drop = shears_drop, _mcl_shears_drop = shears_drop,
_mcl_fortune_drop = fortune_drop, _mcl_fortune_drop = fortune_drop,
node_placement_prediction = "", node_placement_prediction = "",
use_texture_alpha = alpha,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, 0.5, selbox_radius }, fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, 0.5, selbox_radius },
@ -402,7 +397,6 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
palette = palette, palette = palette,
walkable = false, walkable = false,
buildable_to = false, buildable_to = false,
use_texture_alpha = alpha,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, selbox_top_height, selbox_radius }, fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, selbox_top_height, selbox_radius },

View File

@ -466,9 +466,9 @@ function mcl_furnaces.hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", nil, 1) return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src")
else else
return inv, "fuel", mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", mcl_util.is_fuel, 1) return inv, "fuel", mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", mcl_util.is_fuel)
end end
end end

View File

@ -32,68 +32,6 @@ local mcl_hoppers_formspec = table.concat({
"listring[current_player;main]", "listring[current_player;main]",
}) })
local function straight_hopper_act(pos, node, active_object_count, active_count_wider)
local timer = minetest.get_node_timer(pos)
if timer:is_started() then
--Pause if already recived item this tick
return
end
timer:start(1.0)
-- Move from internal inventory to dst first
local dst_pos = vector.offset(pos, 0, -1, 0)
local dst_node = minetest.get_node(dst_pos)
local dst_name = dst_node.name
local dst_def = minetest.registered_nodes[dst_name]
if dst_def and dst_def._mcl_hopper_act then
dst_def._mcl_hopper_act( dst_pos, dst_node, active_object_count, active_count_wider )
end
mcl_util.hopper_push(pos, dst_pos)
local src_pos = vector.offset(pos, 0, 1, 0)
mcl_util.hopper_pull(pos, src_pos)
end
local function bent_hopper_act(pos, node, active_object_count, active_object_count_wider)
local timer = minetest.get_node_timer(pos)
if timer:is_started() then
--Pause if already recived item this tick
return
end
timer:start(1.0)
-- Check if we are empty
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local empty = inv:is_empty("main")
-- Determine to which side the hopper is facing, get nodes
local face = minetest.get_node(pos).param2
local dst_pos = {}
if face == 0 then
dst_pos = vector.offset(pos, -1, 0, 0)
elseif face == 1 then
dst_pos = vector.offset(pos, 0, 0, 1)
elseif face == 2 then
dst_pos = vector.offset(pos, 1, 0, 0)
elseif face == 3 then
dst_pos = vector.offset(pos, 0, 0, -1)
end
local dst_node = minetest.get_node(dst_pos)
local dst_name = dst_node.name
local dst_def = minetest.registered_nodes[dst_name]
if dst_def and dst_def._mcl_hopper_act then
dst_def._mcl_hopper_act( dst_pos, dst_node, active_object_count, active_object_count_wider )
end
if not empty then
mcl_util.hopper_push(pos, dst_pos)
end
local src_pos = vector.offset(pos, 0, 1, 0)
mcl_util.hopper_pull(pos, src_pos)
end
-- Downwards hopper (base definition) -- Downwards hopper (base definition)
---@type node_definition ---@type node_definition
@ -268,7 +206,6 @@ def_hopper_enabled.mesecons = {
end, end,
}, },
} }
def_hopper_enabled._mcl_hopper_act = straight_hopper_act
minetest.register_node("mcl_hoppers:hopper", def_hopper_enabled) minetest.register_node("mcl_hoppers:hopper", def_hopper_enabled)
@ -418,7 +355,6 @@ def_hopper_side_enabled.mesecons = {
end, end,
}, },
} }
def_hopper_side_enabled._mcl_hopper_act = bent_hopper_act
minetest.register_node("mcl_hoppers:hopper_side", def_hopper_side_enabled) minetest.register_node("mcl_hoppers:hopper_side", def_hopper_side_enabled)
---@type node_definition ---@type node_definition
@ -623,7 +559,24 @@ minetest.register_abm({
neighbors = { "group:container" }, neighbors = { "group:container" },
interval = 1.0, interval = 1.0,
chance = 1, chance = 1,
action = straight_hopper_act, action = function(pos, node, active_object_count, active_object_count_wider)
if minetest.get_node_timer(pos):is_started() then
return
end
-- Move from internal inventory to dst first
local dst_pos = vector.offset(pos, 0, -1, 0)
local pushed = mcl_util.hopper_push(pos, dst_pos)
local src_pos = vector.offset(pos, 0, 1, 0)
mcl_util.hopper_pull(pos, src_pos)
local dst_node = minetest.get_node(dst_pos)
if pushed and (dst_node.name == "mcl_hoppers:hopper" or dst_node.name == "mcl_hoppers:hopper_side") then
--Pause destination hopper
minetest.get_node_timer(dst_pos):start(1.0)
end
end,
}) })
-- Register push/pull for "bent" hopper -- Register push/pull for "bent" hopper
@ -633,7 +586,35 @@ minetest.register_abm({
neighbors = { "group:container" }, neighbors = { "group:container" },
interval = 1.0, interval = 1.0,
chance = 1, chance = 1,
action = bent_hopper_act, action = function(pos, node, active_object_count, active_object_count_wider)
if minetest.get_node_timer(pos):is_started() then
--Pause if already recived item this tick
return
end
-- Determine to which side the hopper is facing, get nodes
local face = minetest.get_node(pos).param2
local dst_pos = {}
if face == 0 then
dst_pos = vector.offset(pos, -1, 0, 0)
elseif face == 1 then
dst_pos = vector.offset(pos, 0, 0, 1)
elseif face == 2 then
dst_pos = vector.offset(pos, 1, 0, 0)
elseif face == 3 then
dst_pos = vector.offset(pos, 0, 0, -1)
end
local pushed = mcl_util.hopper_push(pos, dst_pos)
local src_pos = vector.offset(pos, 0, 1, 0)
mcl_util.hopper_pull(pos, src_pos)
local dst_node = minetest.get_node(dst_pos)
if pushed and (dst_node.name == "mcl_hoppers:hopper" or dst_node.name == "mcl_hoppers:hopper_side") then
--Pause destination hopper
minetest.get_node_timer(dst_pos):start(1.0)
end
end,
}) })
minetest.register_craft({ minetest.register_craft({

View File

@ -76,7 +76,8 @@ local lectern_def = {
if wdir == 0 then if wdir == 0 then
return itemstack return itemstack
-- IE., no Hanging Lecterns for you! -- IE., no Hanging Lecterns for you!
else end
if wdir == 1 then
-- (only make standing nodes...) -- (only make standing nodes...)
-- Determine the rotation based on player's yaw -- Determine the rotation based on player's yaw
local yaw = pi * 2 - placer:get_look_horizontal() local yaw = pi * 2 - placer:get_look_horizontal()
@ -135,11 +136,5 @@ minetest.register_craft({
} }
}) })
minetest.register_craft({
type = "fuel",
recipe = "mcl_lectern:lectern",
burntime = 15,
})
-- Base Aliases. -- Base Aliases.
minetest.register_alias("lectern", "mcl_lectern:lectern") minetest.register_alias("lectern", "mcl_lectern:lectern")

View File

@ -26,9 +26,3 @@ minetest.register_craft({
{ "group:wood", "group:wood", "" }, { "group:wood", "group:wood", "" },
} }
}) })
minetest.register_craft({
type = "fuel",
recipe = "mcl_loom:loom",
burntime = 15,
})

View File

@ -426,12 +426,6 @@ minetest.register_craft({
burntime = 15, burntime = 15,
}) })
minetest.register_craft({
type = "fuel",
recipe = "mcl_mangrove:mangrove_roots",
burntime = 15,
})
local adjacents = { local adjacents = {
vector.new(1,0,0), vector.new(1,0,0),
vector.new(-1,0,0), vector.new(-1,0,0),

View File

@ -257,12 +257,6 @@ minetest.register_craft({
}, },
}) })
minetest.register_craft({
type = "fuel",
recipe = "mcl_smithing_table:table",
burntime = 15,
})
-- this is the exact same as mcl_smithing_table.upgrade_item_netherite , in case something relies on the old function -- this is the exact same as mcl_smithing_table.upgrade_item_netherite , in case something relies on the old function
function mcl_smithing_table.upgrade_item(itemstack) function mcl_smithing_table.upgrade_item(itemstack)
return mcl_smithing_table.upgrade_item_netherite(itemstack) return mcl_smithing_table.upgrade_item_netherite(itemstack)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 B

After

Width:  |  Height:  |  Size: 265 B

View File

@ -1151,28 +1151,15 @@ Source path,Source file,Target file,xs,ys,xl,yl,xt,yt,Blacklisted?
/assets/minecraft/textures/block,redstone_dust_line1.png,redstone_redstone_dust_line1.png,,,,,,, /assets/minecraft/textures/block,redstone_dust_line1.png,redstone_redstone_dust_line1.png,,,,,,,
/assets/minecraft/textures/block,attached_melon_stem.png,mcl_farming_melon_stem_connected.png,,,,,,, /assets/minecraft/textures/block,attached_melon_stem.png,mcl_farming_melon_stem_connected.png,,,,,,,
/assets/minecraft/textures/block,melon_stem.png,mcl_farming_melon_stem_disconnected.png,,,,,,, /assets/minecraft/textures/block,melon_stem.png,mcl_farming_melon_stem_disconnected.png,,,,,,,
/assets/minecraft/textures/entity/signs,acacia.png,mcl_signs_acacia_sign.png,,,,,,, /assets/minecraft/textures/entity/signs,acacia.png,mcl_signs_sign_acacia.png,,,,,,,
/assets/minecraft/textures/entity/signs,bamboo.png,mcl_bamboo_bamboo_sign.png,,,,,,, /assets/minecraft/textures/entity/signs,bamboo.png,mcl_bamboo_bamboo_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,birch.png,mcl_signs_birch_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,cherry.png,mcl_cherry_blossom_sign.png,,,,,,, /assets/minecraft/textures/entity/signs,cherry.png,mcl_cherry_blossom_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,crimson.png,mcl_signs_crimson_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,dark_oak.png,mcl_signs_sign_dark.png,,,,,,, /assets/minecraft/textures/entity/signs,dark_oak.png,mcl_signs_sign_dark.png,,,,,,,
/assets/minecraft/textures/entity/signs,jungle.png,mcl_signs_jungle_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,mangrove.png,mcl_signs_mangrove_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,oak.png,mcl_signs_sign.png,,,,,,, /assets/minecraft/textures/entity/signs,oak.png,mcl_signs_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,spruce.png,mcl_signs_spruce_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,warped.png,mcl_signs_warped_sign.png,,,,,,,
/assets/minecraft/textures/item,acacia_sign.png,mcl_signs_acacia_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,bamboo_sign.png,mcl_bamboo_bamboo_sign_wield.png,,,,,,, /assets/minecraft/textures/item,bamboo_sign.png,mcl_bamboo_bamboo_sign_wield.png,,,,,,,
/assets/minecraft/textures/item,birch_sign.png,mcl_signs_birch_sign_inv.png,,,,,,, /assets/minecraft/textures/item,cherry_sign.png,mcl_cherry_blossom_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,cherry_sign.png,mcl_cherry_blossom_inv.png,,,,,,, /assets/minecraft/textures/item,dark_oak_sign.png,mcl_signs_default_sign_dark.png,,,,,,,
/assets/minecraft/textures/item,crimson_sign.png,mcl_signs_crimson_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,dark_oak_sign.png,mcl_signs_default_dark.png,,,,,,,
/assets/minecraft/textures/item,jungle_sign.png,mcl_signs_jungle_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,mangrove_sign.png,mcl_signs_mangrove_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,oak_sign.png,mcl_signs_default_sign.png,,,,,,, /assets/minecraft/textures/item,oak_sign.png,mcl_signs_default_sign.png,,,,,,,
/assets/minecraft/textures/item,spruce_sign.png,mcl_signs_spruce_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,warped_sign.png,mcl_signs_warped_sign_inv.png,,,,,,,
/assets/minecraft/textures/entity,banner_base.png,mcl_banners_banner_base.png,,,,,,, /assets/minecraft/textures/entity,banner_base.png,mcl_banners_banner_base.png,,,,,,,
/assets/minecraft/textures/entity/banner,base.png,mcl_banners_base.png,,,,,,, /assets/minecraft/textures/entity/banner,base.png,mcl_banners_base.png,,,,,,,
/assets/minecraft/textures/block,nether_portal.png,mcl_portals_portal.png,,,,,,, /assets/minecraft/textures/block,nether_portal.png,mcl_portals_portal.png,,,,,,,

1 Source path Source file Target file xs ys xl yl xt yt Blacklisted?
1151 /assets/minecraft/textures/block redstone_dust_line1.png redstone_redstone_dust_line1.png
1152 /assets/minecraft/textures/block attached_melon_stem.png mcl_farming_melon_stem_connected.png
1153 /assets/minecraft/textures/block melon_stem.png mcl_farming_melon_stem_disconnected.png
1154 /assets/minecraft/textures/entity/signs acacia.png mcl_signs_acacia_sign.png mcl_signs_sign_acacia.png
1155 /assets/minecraft/textures/entity/signs bamboo.png mcl_bamboo_bamboo_sign.png
/assets/minecraft/textures/entity/signs birch.png mcl_signs_birch_sign.png
1156 /assets/minecraft/textures/entity/signs cherry.png mcl_cherry_blossom_sign.png
/assets/minecraft/textures/entity/signs crimson.png mcl_signs_crimson_sign.png
1157 /assets/minecraft/textures/entity/signs dark_oak.png mcl_signs_sign_dark.png
/assets/minecraft/textures/entity/signs jungle.png mcl_signs_jungle_sign.png
/assets/minecraft/textures/entity/signs mangrove.png mcl_signs_mangrove_sign.png
1158 /assets/minecraft/textures/entity/signs oak.png mcl_signs_sign.png
/assets/minecraft/textures/entity/signs spruce.png mcl_signs_spruce_sign.png
/assets/minecraft/textures/entity/signs warped.png mcl_signs_warped_sign.png
/assets/minecraft/textures/item acacia_sign.png mcl_signs_acacia_sign_inv.png
1159 /assets/minecraft/textures/item bamboo_sign.png mcl_bamboo_bamboo_sign_wield.png
1160 /assets/minecraft/textures/item birch_sign.png cherry_sign.png mcl_signs_birch_sign_inv.png mcl_cherry_blossom_sign_inv.png
1161 /assets/minecraft/textures/item cherry_sign.png dark_oak_sign.png mcl_cherry_blossom_inv.png mcl_signs_default_sign_dark.png
/assets/minecraft/textures/item crimson_sign.png mcl_signs_crimson_sign_inv.png
/assets/minecraft/textures/item dark_oak_sign.png mcl_signs_default_dark.png
/assets/minecraft/textures/item jungle_sign.png mcl_signs_jungle_sign_inv.png
/assets/minecraft/textures/item mangrove_sign.png mcl_signs_mangrove_sign_inv.png
1162 /assets/minecraft/textures/item oak_sign.png mcl_signs_default_sign.png
/assets/minecraft/textures/item spruce_sign.png mcl_signs_spruce_sign_inv.png
/assets/minecraft/textures/item warped_sign.png mcl_signs_warped_sign_inv.png
1163 /assets/minecraft/textures/entity banner_base.png mcl_banners_banner_base.png
1164 /assets/minecraft/textures/entity/banner base.png mcl_banners_base.png
1165 /assets/minecraft/textures/block nether_portal.png mcl_portals_portal.png

View File

@ -122,9 +122,6 @@ def convert_textures(make_texture_pack, dry_run, verbose, base_dir, tex_dir, tem
description_file.write(description) description_file.write(description)
description_file.close() description_file.close()
# Create override file
shutil.copyfile("override.txt", target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/override.txt")
# Create preview image (screenshot.png) # Create preview image (screenshot.png)
os.system("convert -size 300x200 canvas:transparent "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png") os.system("convert -size 300x200 canvas:transparent "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png")
os.system("composite "+base_dir+"/pack.png "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png -gravity center "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png") os.system("composite "+base_dir+"/pack.png "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png -gravity center "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png")

View File

@ -1,57 +0,0 @@
Signs:
mcl_signs:wall_sign_warped_hyphae_wood inventory mcl_signs_warped_sign_inv.png
mcl_signs:wall_sign_warped_hyphae_wood wield mcl_signs_warped_sign_inv.png
mcl_signs:wall_sign_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:standing_sign_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:standing_sign22_5_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:standing_sign45_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:standing_sign67_5_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:wall_sign_c rimson_hyphae_wood inventory mcl_signs_crimson_sign_inv.png
mcl_signs:wall_sign_crimson_hyphae_wood wield mcl_signs_crimson_sign_inv.png
mcl_signs:wall_sign_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:standing_sign_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:standing_sign22_5_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:standing_sign45_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:standing_sign67_5_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:wall_sign_acaciawood inventory mcl_signs_acacia_sign_inv.png
mcl_signs:wall_sign_acaciawood wield mcl_signs_acacia_sign_inv.png
mcl_signs:wall_sign_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:standing_sign_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:standing_sign22_5_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:standing_sign45_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:standing_sign67_5_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:wall_sign_birchwood inventory mcl_signs_birch_sign_inv.png
mcl_signs:wall_sign_birchwood wield mcl_signs_birch_sign_inv.png
mcl_signs:wall_sign_birchwood all mcl_signs_birch_sign.png
mcl_signs:standing_sign_birchwood all mcl_signs_birch_sign.png
mcl_signs:standing_sign22_5_birchwood all mcl_signs_birch_sign.png
mcl_signs:standing_sign45_birchwood all mcl_signs_birch_sign.png
mcl_signs:standing_sign67_5_birchwood all mcl_signs_birch_sign.png
mcl_signs:wall_sign_junglewood inventory mcl_signs_jungle_sign_inv.png
mcl_signs:wall_sign_junglewood wield mcl_signs_jungle_sign_inv.png
mcl_signs:wall_sign_junglewood all mcl_signs_jungle_sign.png
mcl_signs:standing_sign_junglewood all mcl_signs_jungle_sign.png
mcl_signs:standing_sign22_5_junglewood all mcl_signs_jungle_sign.png
mcl_signs:standing_sign45_junglewood all mcl_signs_jungle_sign.png
mcl_signs:standing_sign67_5_junglewood all mcl_signs_jungle_sign.png
mcl_signs:wall_sign_mangrove_wood inventory mcl_signs_mangrove_sign_inv.png
mcl_signs:wall_sign_mangrove_wood wield mcl_signs_mangrove_sign_inv.png
mcl_signs:wall_sign_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:standing_sign_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:standing_sign22_5_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:standing_sign45_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:standing_sign67_5_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:wall_sign_sprucewood inventory mcl_signs_spruce_sign_inv.png
mcl_signs:wall_sign_sprucewood wield mcl_signs_spruce_sign_inv.png
mcl_signs:wall_sign_sprucewood all mcl_signs_spruce_sign.png
mcl_signs:standing_sign_sprucewood all mcl_signs_spruce_sign.png
mcl_signs:standing_sign22_5_sprucewood all mcl_signs_spruce_sign.png
mcl_signs:standing_sign45_sprucewood all mcl_signs_spruce_sign.png
mcl_signs:standing_sign67_5_sprucewood all mcl_signs_spruce_sign.png