Releases: 2008Choco/Alchema
Per-recipe permissions, item NBT support, customizable recipes, and bug fixes
IMPORTANT: This update adds new custom Metrics charts. While I encourage you to keep these charts enabled (as it helps me understand where I need to focus my efforts when it comes to new features - seeing how people use the plugin), I understand that some feel uncomfortable sending statistics, even if they are anonymous. If you are one of these people, please pay attention to the Metrics-related changes/additions.
Changelog
- Recipes now support item NBT formats equivalent to the
/give
command (1.18.2+). See below for changes - Recipe results now support a
"type"
much like ingredients do, thoughalchema:item
is the only natively supported result type- This allows third-party plugins to register their own result types which may be used in recipe files
- All default recipe files have had
"type": "alchema:item"
added to their"result"
object for the sake of consistency
- Added permissions to craft each individual recipe
- Recipe permission are automatically generated and follow the format
alchema.craft.<namespace>.<recipe_id>
. Examples:- The default
gravel.json
permission would bealchema.craft.alchema.gravel
- The default
ores/coal_ore.json
permission would bealchema.craft.alchema.ores.coal_ore
(note that forward slashes are replaced with dots)
- The default
- Every permission is a child of
alchema.craft
and are therefore all granted by default. To prevent a player from crafting a recipe, you must negate the recipe's permission (i.e. set it tofalse
). Refer to your permission plugin's documentation - If a player attempts to craft a recipe to which they do not have permission, the cauldron will drop all ingredients for the player to pick up and they will be informed that they do not have permission to craft that recipe
- Recipe permission are automatically generated and follow the format
- Added new configuration options to customize the recipe of empty vials
VialOfEssence.Recipe.Enabled
: Whether or not the recipe is enabled. If set to false, the recipe will not be registeredVialOfEssence.Recipe.Yield
: The amount of vials given in the recipeVialOfEssence.Recipe.Shape
: A list of strings determining the shape of the recipe (MUST have 3 entries, EACH a length of 3 characters)VialOfEssence.Recipe.Ingredients
: A section mapping the characters defined in the shape to one or more materials
- Added 5 new bStats Metrics charts. This data is sent anonymously.
loaded_cauldrons
: A pie chart showing how many cauldrons are loaded on the servercauldron_recipes
: A pie chart showing how many cauldron recipes are loaded on the servercauldron_crafts
: A line chart showing how many crafts have been successfully completed in a cauldroncauldron_recipe_ingredient_types
: A pie chart showing how many of each recipe ingredient type is usedcauldron_recipe_result_types
: A pie chart showing how many of each recipe result type is used- These statistics can always be viewed at https://bstats.org/plugin/bukkit/Alchema and are 100% anonymous. See below for more control over what is anonymized
- Added 2 new options in the config.yml:
Metrics.Enabled
: ReplacesMetrics
boolean, defaults totrue
(be sure to update this if you had it set tofalse
before)Metrics.AnonymousCustomRecipeTypes
: Marks and anonymizes any non-native recipe result or ingredient types (e.g. anything that isn't Alchema or MMOItems) as "Third-Party Ingredient Type" (or "Result Type") when being sent to bStats. Defaults tofalse
- Set this to
true
if you have a custom plugin that registers custom Alchema recipe ingredients and you do not want this plugin to be publicly displayed. Otherwise, the name of the plugin will be on a bStats chart
- Set this to
- Ender Dragons and Giants now have corresponding entity essence
- Optimized how and when cauldrons check for heat sources and bubble. Performance should be improved by about 50%
- Improved item serialization for cauldrons between restarts and reloads
- The entity names shown in the player's action bar when collecting essence from an entity now use translatable components rather than a best-attempt name based on its registry key
- (For developers) Alchemical cauldrons now have 2 metadata values associated with them:
alchema:alchemical_cauldron
: Whether or not the block is an alchemical cauldron. Value is alwaystrue
alchema:alchemical_cauldron_bubbling
: Whether or not the alchemical cauldron is boiling. Value is lazy, but never caches. Can be eithertrue
orfalse
- Fixed
Metrics: false
not actually disabling metrics, even if set to false. (Please update your config according to the changes mentioned above) - Fixed killed entities dropping essence (either via loot or directly into a cauldron) even if they recently had their essence collected with a vial
- Fixed
/givevial
throwing an exception if no entities were selected - Fixed
/givevial
throwing an exception if provided an invalid entity selector - Fixed some items losing data if they were still in a cauldron when the server shut down
- Removed the
example_item.json
file as it is no longer relevant - Removed the "shameless self-promotion" of AlchemicalArrows when running
/alchema integrations
- Removed the
Metrics
boolean option in the config.yml. It has now been moved toMetrics.Enabled
Item NBT In Recipe Files
Recipe files have gotten a huge upgrade. Prior to this version, custom data for ingredients and results (such as names, lore, enchantments, etc.) all had to be done with a relatively undocumented JSON format. This format was incomplete and often lacked support for NBT of newer items. Now, for any ingredient or result with type: "alchema:item"
, the "item"
field now accepts a /give-compliant item argument (i.e. the same sort of argument you would supply to a Minecraft /give
command to get an item).
- More familiar for most server owners (assuming they've written a
/give
command before) - Allows for custom NBT values which better supports third-party plugins
- Will always be up-to-date and support modern NBT values that Minecraft adds in the future
An example recipe file may now look like this:
{
"result": {
"type": "alchema:item",
"item": "netherite_sword{display:{Name:\"{\\\"text\\\":\\\"Hello World\\\"}\"},Enchantments:[{id:\"minecraft:sharpness\",lvl:10}]}"
},
"ingredients": [
{
"type": "alchema:entity_essence",
"entity": "minecraft:blaze",
"amount": 250
},
{
"type": "alchema:item",
"item": "minecraft:netherite_ingot{CustomModelData:1}"
},
{
"type": "alchema:material",
"item": "minecraft:stick"
}
]
}
As you can see, the ingredient requires two netherite ingots with CustomModelData 1, and the result will be a netherite sword with the name "Hello World" and Sharpness X. You must be very careful with the quotation marks, however. They should be escaped correctly or items will fail to load (notice how the "Name" in the result has to triple escape (\\\
)).
NOTE: This only works on modern version of Minecraft 1.18.2. While Alchema still supports 1.17.x+, the API to support this functionality was only added in April of 2022. If you are still unable to use this functionality on 1.18.2, update your server and you should be able to use it.
API Changes
- Added
CauldronRecipeResult
, an interface similar toCauldronIngredient
that may be implemented by third party plugins to create custom result types- Only one native implementation of this interface,
RecipeResultItemStack
- Custom result types may be registered via
CauldronRecipeRegistry#registerResultType()
- Only one native implementation of this interface,
- Added
CauldronRecipe#getCraftingPermission()
CauldronDropItemsEvent
may now be forced to ignore its cancellation state. A new reason was added,NO_PERMISSION
, which uses this state.AlchemicalCauldron#dropItems()
has a new overload that accepts a boolean whether or not to ignore the cancellation state of this eventDefaultEntityEffects
is now package-private. It is not meant for public use- Fixed items removed from
CauldronIngredientsDropEvent#getItems()
not actually being removed properly, or if the event was cancelled - Added
AlchemicalCauldron#isValid()
to check whether or not a cauldron is still a valid alchemical cauldron - Deprecation policies have been clarified on more methods, as well as mutability of collections, among other useful Jetbrains annotations
Deprecations
- All current deprecations are expected to be removed by the next major release, 1.4.0. Please move to the provided alternatives as soon as possible.
ItemUtil
has been marked as internal and should not be expected to maintain compatibility beyond this release. It has no API contract and should be avoided at all costsCauldronRecipe#getResult()
has been deprecated and replaced withCauldronRecipe#getRecipeResult()
CauldronItemCraftEvent#getResult()
and#setResult(ItemStack)
have been deprecated and replaced withgetRecipeResult()
andsetRecipeResult(CauldronRecipeResult)
Minor Bug Fixes
Changelog
- Changed versioning scheme to be suffixed with
-SNAPSHOT
- Fixed ingredients dropping illegal stack sizes (e.g. putting 32 ender pearls in a cauldron and removing water from the cauldron would drop a stack of 32 ender pearls instead of 2 stacks of 16 ender pearls)
- Fixed death by boiling cauldron messages sending empty messages if any configured messages are empty or whitespace
- Fixed boiling cauldrons not persisting across reloads and server reboots
1.17/1.18 Support, Java 16, MMOItems Integration
Changelog
- Support for Minecraft 1.17.x and 1.18.x
- Dropped support for Minecraft 1.16.x
- Minimum required Java version is now Java 16 (required by Minecraft 1.17 anyways, you should have this installed already)
- Added integration with MMOItems
- Recipe types may now be
mmoitems:mmoitem
which requires anitem_type
,id
, and an optionalamount
.
- Recipe types may now be
- Added an optional
-f
argument to/saverecipe
to forcibly save the recipe file. If set, it will overwrite a recipe file if one exists at the given path - Added a new configuration option,
EnforcePlayerDroppedItems
. When set totrue
, only items dropped by players are allowed - Added a new permission node,
alchema.craft
. Default to all players. When revoked, players cannot craft items in cauldrons. - Added 3 new recipes for Minecraft 1.17/1.18:
entities/glow_ink_sac
: 50 Glow Squid essence, 1 ink sac = 1 glow ink sacfood/glow_berries
: 4 sweet berries, 1 glowstone dust = 4 glow berriesores/copper_ore
: 2 copper ingots, 1 stone = 1 copper ore
"name"
and"description"
are now supported fields in all recipe files, but remain unused currently
API Changelog
- Added
CauldronIngredient#getComplexity()
. Allows recipe types to calculate their own complexity values - Added
CauldronIngredient#describe()
. Describes an ingredient as a string - Added
CauldronRecipeRegistry#getCauldronRecipe(NamespacedKey)
CauldronRecipe
has been converted from a class to an interface. This is a breaking change. Plugins are expected to useCauldronRecipe.builder()
to create recipes- Depreacted
CauldronRecipe.Builder#setComment()
andsetExperience()
. Replaced withcomment()
andexperience()
Performance & API Refinements
Changelog
- More complex recipes will now take priority over less complex recipes in the cauldron
- Recipe complexity depends on item quantity (though this may change in the future. This is a test)
- For example, if you have two recipes, one that takes 2 emeralds and 1 stone, another that takes 1 emerald and 1 stone, if 5 emeralds and 3 stone are thrown into the cauldron, the first recipe will trigger twice and the second will trigger once
- This behaviour was previously dependent on registration order. Complexity ensures that the most complex recipe is crafted first
- Added
/alchema saverecipe
which allows server owners to save one (or more) default recipe(s) that otherwise would not be automatically generated- This command makes the process simpler when new default recipes are added to Alchema and no longer requires an admin to copy/paste new recipe files from GitHub.
- Tab completion will ensure that all available recipes are displayed and easy to save
- Trailing wildcards are supported, meaning
/alchema saverecipe concrete/*
will save all recipes under the default concrete directory. - Permission:
alchema.command.saverecipe
. Default op
- A new
example_item.json
will be generated in the root Alchema folder demonstrating all available options for items in Alchema's recipes files - Improvements to the efficiency of recipe searching. May be slightly more performant
- Improvements to the efficiency of hash-based lookups for recipe and recipe ingredient objects
API Changelog
- Many utility classes were removed in favour of ChocoCommons, a new library containing otherwise identical classes, just under a new package,
wtf.choco.commons.*
GSON
is no longer publicly accessible inAlchema
. It was never meant for public use- Added 2 new methods to do with recipe complexity in the
CauldronRecipeRegistry
CauldronRecipeRegistry#getApplicableRecipe(List<CauldronIngredient>, boolean) : CauldronRecipe
CauldronRecipeRegistry#getApplicableRecipes(List<CauldronIngredient>) : List<CauldronRecipe>
- Added
CauldronRecipe#getComplexity() : int
CauldronRecipeRegistry#registerIngredientType()
will no longer accept registrationsonEnable()
and instead throw an exception. These calls should be madeonLoad()
Recipe experience, entity death experience and QOL
Changelog
- Recipe files now accept
experience
in the root of the JSON, an integer property determining the amount of experience to grant the user when crafting that recipe- Similar to how furnace recipes give experience. Though this value is optional and defaults to 0
- Many default recipes were updated to include experience
- Blaze rod: 3 experience points
- Fermented spider eye: 2 experience points
- Ghast tear: 5 experience points
- Coal ore: 1 experience point
- Diamond ore: 2 experience points
- Emerald ore: 3 experience points
- Lapis lazuli ore: 1 experience point
- Redstone ore: 1 experience point
- Emerald: 4 experience points
- Heart of the sea: 8 experience points
- Adjusted the amounts of ingots/gems required for a few of the ore recipes:
- Diamond ore: 2 diamonds -> 3 diamonds
- Emerald ore: 2 emeralds -> 3 emeralds
- Lapis lazuli ore: 2 lapis lazuli -> 6 lapis lazuli
- Redstone ore: 2 redstone -> 6 redstone
- Entities that die in a cauldron will now insert the respective entity essence into the cauldron
- Added
Cauldron.Entities.Damage
to determine whether or not entities take damage - Added
Cauldron.Entities.MinEssenceOnDeath
, the minimum amount of essence to generate - Added
Cauldron.Entities.MaxEssenceOnDeath
, the maximum amount of essence to generate - Removed
Cauldron.DamageEntities
. This is superseded by the aforementioned options
- Added
- Stained glass panes may now be used to craft empty vials
- Added
Cauldron.ItemSearchInterval
, a tick value to delay the time between which the cauldron checks for nearby items to consider ingredients- If you are noticing large lag spikes, you may benefit from increasing this value to 2 or higher
- Beyond 5, Alchema's realism may start to decrease and become less accurate
- Better support for third party plugins
- Plugins that modify entity drops will now be able to manipulate entity essence drops
- World protection plugins preventing entity interaction will now prevent entity essence collection
- Update bStats to 2.2.1
- Fixed cauldrons continuing to tick after being exploded or removed with block-changing plugins (such as WorldEdit)
API Changelog
CauldronRecipe#setComment(Optional)
as well asCauldronRecipe
's constructors are now deprecated- In version 1.2.0 of Alchema,
CauldronRecipe
will become an interface
- In version 1.2.0 of Alchema,
- Added
CauldronRecipe.builder()
, a static method to construct instances ofCauldronRecipe
. This should be used in place of the constructors - Added new events:
EntityDeathByCauldronEvent
called when an entity dies as a result of cauldron damageCauldronBubbleEvent
called when a cauldron starts to bubbleCauldronEvent
, a general-purpose abstract base event for all cauldron-related events. Not listenable. Akin toBlockEvent
- Added
CauldronIngredientAddEvent#getPlayerUUID()
for convenience
Entity Essence, New Recipes & Better Recipe Loading
This plugin is still alive and as strong as ever. I have a load of features planned for this plugin, just you wait!
Changelog
- Added entity essence, a new mechanic and crafting ingredient for cauldron recipes. See below
- Added numerous new configuration options to customize all about entity essence
- Added
/givevialofessence
(alias:/giveessence
)- Permission:
alchema.command.givevialofessence
, default op - Gives empty vials or vials of entity essence to the command executor or the specified player
- Permission:
- Added new default recipes:
- 1x Emerald: 500 villager essence + 1 diamond
- 1x Blaze Rod: 50 blaze essence + 1 stick
- 1x Ghast Tear: 250 ghast essence + 1 iron nugget
- 2x Gunpowder: 50 creeper essence + 1 redstone
- 1x Ink Sac: 25 squid essence + 1 black dye
- 3x Leather: 250 cow essence + 4 rotten flesh
- 2x Turtle Egg: 100 turtle essence + 1 egg
- 1x Heart of the Sea: 250 dolphin essence + 4 nautilus shells
- 4x Honeycomb: 1 honey bottle + 1 sugar
- 8x Gravel: 8 cobblestone + 1 flint
- 8x Sand: 8 gravel + 1 flint
- All of the above recipes may be found in the default recipe directory if you wish to use them
- Recipes will now fail more gracefully and not prevent other recipes from loading. Any errors with loading will be presented with a readable reasoning
- Added
/alchema reload verbose
, an optional argument which shows errors in chat if one or more recipe failed to load- Permission:
alchema.command.reload.verbose
, default op. Child ofalchema.command.reload
- Permission:
- Custom model data may now be loaded for items in recipe files (ex:
"custom_model_data": 10
) - Fixed CustomModelData being discarded when dropping an item into and retrieving from an alchemical cauldron
- Fixed inaccurate version check suffixes when running
/alchema version
. It will now show if on a dev version or if an update check failed
API Changelog
Javadocs for Alchema are hosted at https://choco.wtf/javadocs/alchema
- Added
CauldronIngredientEntityEssence
, an ingredient implementation for entity essence - Added
EssenceConsumptionCallback
, a functional interface called when a player consumes a vial of entity essence - Added
EntityEssenceData
containing information about entity essence data such as type, colour, consumption callbacks, etc. - Added
EntityEssenceEffectRegistry
to register different types of entity essence- All living vanilla entities have registered entity essence, though you may register and override the data registered by Alchema by default
- Added
Alchema#getEntityEssenceEffectRegistry()
to get an instance of the effect registry CauldronIngredientsDropEvent#getItems()
now returns aList<Item>
instead of aList<ItemStack>
- Added a few new events to accommodate the new entity essence mechanics
EntityDropEssenceEvent
: Called when a living entity is killed and drops a vial of entity essencePlayerConsumeEntityEssenceEvent
: Called when a player consumes a vial of entity essencePlayerEssenceCollectEvent
: Called when a player collects essence from an entity with a vial of essence or an empty vial
- Added
AlchemicalCauldron#dropIngredients(CauldronIngredientsDropEvent.Reason, Player)
- Added default method
CauldronIngredient#drop(AlchemicalCauldron, World, Location)
, returning aList<Item>
, a list of item entities dropped in the world- By default, this drops and returns the result of
asItemStack()
- This is called by the
CauldronIngredientEntityEssence
to drop more than one vial of essence if it exceeds the maximum amount of essence in a vial
- By default, this drops and returns the result of
- Added new constants to the
AlchemaConstants
including metadata keys, nbt keys, new configuration options and permission nodes
Notes For Contributors
This project now has unit testing to ensure the presence of nullability annotations on all methods and parameters, as well as better checkstyle enforcement through Maven. If you plan on contributing to this project (which I highly encourage, contributions are welcome), PLEASE be sure to abide by the checkstyle execution as well as ensuring that all tests pass. This will now be checked when a new PR is opened.
Entity Essence
Entity essence is a new mechanic introduced to integrate the witchcraft and brewery aspects that Alchema aims to provide. Entity essence is a new type of cauldron ingredient that may be used in crafting recipes such as blaze rods with blaze essence and sticks, or emeralds with villager essence and diamonds. Being able to convert one material into another with the essence of entity allows for much more flexible recipe design and makes the world of Minecraft feel more immersive with the world of Alchema.
Players may craft empty vials with 3 glass panes in a bucket or glass bottle formation. These vials may then be used by right clicking on an entity to collect a random amount of essence. Entities can only have essence collected every 5 minutes (by default) unless the player is in creative mode. Players may also collect essence from entities using a vial of essence of the same type (i.e. clicking on a cow with a vial of cow essence) up to 1,000 (by default) essence per vial. These vials of essence can be dropped right into a cauldron and used for recipes involving entity essence.
Entities also all have a chance of dropping vials of entity essence. Although this is much more rare (by default, 0.75% chance), more essence may be yielded. The chance of dropping essence increases if the entity is killed with a weapon enchanted with Looting. Though this essence is no different than collecting it from an entity directly.
Additionally, all entity essence may be consumed by the player much like a potion. While not all entity essences have effects, some do! Some give you potion effects while others, like enderman essence, will teleport you around akin to a chorus fruit. Explore some of the essence types.
Below are the new default configuration options for entity essence, as well as an explanation of what each option does
VialOfEssence:
# The maximum amount of entity essence that can be stored in a vial
MaximumEssence: 1000
FromEntities:
OnDeath:
# The chance (0.0 - 100.0) that an entity will drop a vial of essence on death
BaseDropChance: 0.75
# The minimum amount of essence the entity can drop
Min: 50
# The maximum amount of essence the entity can drop
Max: 250
# A list of entities that will not drop essence on death. Example:
# Blacklist:
# - "minecraft:zombie"
# - "minecraft:creeper"
Blacklist: []
OnInteract:
# Whether or not essence may be collected by players when right clicking an entity with an empty vial
Enabled: true
# The time, in seconds, between which a player can collect essence from the same entity
TimeoutSeconds: 300
# The minimum amount of essence that can be collected from an entity by a player
Min: 10
# The maximum amount of essence that can be collected from an entity by a player
Max: 25
# A list of entities from which essence cannot be collected
Blacklist: []
Consumption:
# A list of messages to send to the player when consuming entity essence with no effect
# One message will be selected at random
TastelessThoughts:
- "That was rather tasteless... I shouldn't do that again."
- "What a waste of essence... I shouldn't drink this stuff."
- "Interestingly tasteless, disappointingly wasteful."
- "Surely there was a better use for that essence than drinking it."
Item:
Empty:
# The name to use for empty vials
Name: "&fEmpty Vial"
# The lore to use for empty vials
Lore:
- "&7&oCollects entity essence."
# The custom model data to use for empty vials
CustomModelData: 1
Filled:
# The name to use for vials of entity essence
# %entity% will be replaced with the name of the entity type
Name: "&fVial of Essence &7(%entity%)"
# The lore to use for vials of entity essence
# %entity% will be replaced with the name of the entity type
# %quantity% will be replaced with the quantity of essence in the vial
# %max_quantity% will be replaced with the maximum quantity of essence allowed in a vial (configurable, see above)
Lore:
- "&7Quantity: &f%quantity%/%max_quantity%"
- ""
- "&7&oCauldron crafting ingredient."
# The custom model data to use for vials of entity essence
CustomModelData: 2
Don't want to use entity essence on your server? Too "modded" or unrealistic for your liking? No problem! Alchema is extremely configurable and allows you to either delete or change any of the recipes involving entity essence. Additionally, you may set the chance for dropping entity essence to 0.0 and deny the collection of essence from entities so the only means of obtaining it is by command.
Update Checker Fix & Concrete Recipes
Changelog
- Added 16 new default recipes for concrete, one for each colour. Thank you to WanderingPoet on Discord for the recipe ideas 😄
- 8 coloured concrete powder + 1 gravel = 8 concrete of the same colour
- Recipe JSON files now support a
"comment"
field, to which WanderingPoet has been added in the aforementioned recipes - Fixed the update checker displaying a message despite there not actually being an update
API Changelog
- Added
CauldronRecipe#setComment(Optional<String>)
andgetComment() : Optional<String>
Improved Performance
Changelog
- Attempted fix at improving server performance of cauldrons
- Added explicit
alchema.command.*
permission to grant access to all commands. Defaults to op - The update checker is now more aggressive about notifying users about updates. A message is sent on join if an update is available
- Users with the permission
alchema.updatenotify
will be sent this message. Defaults to op - This feature is a test to see if it incentivizes more frequent updates as they go otherwise unnoticed unless monitoring
/alchema version
or the console
- Users with the permission
API Changes:
- Added
AlchemicalCauldron#isLoaded()
Bug Fix & Minor Adjustments
Overview
Once again, thank you for the positive support on recent releases of Alchema over the last week. I hope you all had wonderful holidays and welcome to 2021! This release addresses a couple rare issues as well as adjusts how recipes are read and structured in Alchema's recipe file system.
Changelog
- Recipes may now be categorized under subdirectories
- The default recipes of Alchema have been restructured to reflect this change.
ores/
andfood/
directories have been created and had recipes moved by default - Directories, much like recipes, must be lowercased and separated by underscores, not spaces
- The resulting recipe key will take on its relative path. For example,
alchema:diamond_ore
is nowalchema:ores/diamond_ore
as it is located in theores
directory
- The default recipes of Alchema have been restructured to reflect this change.
- Added a configuration option to change the pool of death messages when dying in a cauldron
- If this option is set to an empty list (
[]
), no death message will be sent
- If this option is set to an empty list (
- If a new update is available, it will be displayed next to the version (in
/alchema version
) rather than on its own line - Fixed rare
IllegalArgumentException: amount must be > 0
due to Spigot's item merging
API Changes
- Added numerous new methods to
AlchemicalCauldron
AlchemicalCauldron#hasValidHeatSource() : boolean
AlchemicalCauldron#getX() : int
,#getY() : int
and#getZ() : int
AlchemicalCauldron#getHeatSourceX() : int
,#getHeatSourceY() : int
,#getHeatSourceZ() : int
and#getHeatSourceLocation() : Location
- Deprecated
AlchemicalCauldron#getFireBlock()
. Prefer insteadgetHeatSourceBlock()
Bug Fixes, Campfires & Integrations
Overview
Thank you for the positive feedback on the initial release of Alchema! This release addresses a few common issues in the initial release and adds a couple new features to better tie Alchema into its integrations and the Minecraft world.
Changelog
- Lit campfires (regular & soul), soul fire and lava may now be used as a heat source for cauldrons (#2)
- Alchema may now be found on SpigotMC!
- The update checker has been enabled as of this version
- The resource page link has been added to
/alchema version
- Added
/alchema integrations
which lists all plugins integrating with Alchema to add recipes- Permission:
alchema.command.integrations
. Default totrue
- Permission:
- Full item data is now parsed from the result rather than just types and amounts (i.e. you can include enchantments, names, lore, etc.)
- The time taken to reload recipes is now shown on startup and when executing
/alchema reload
- Fixed more than one cauldron not being able to bubble while in the world
- Fixed tab completion for
/alchema
displaying arguments to which the player did not have access
API Changes
CauldronRecipe#addIngredient(CauldronIngredient)
was removed.CauldronRecipe
is immutableAlchema#loadCauldronRecipes()
has been moved toCauldronRecipeRegistry#loadCauldronRecipes(Alchema, File)
RecipeLoadResult
was moved fromwtf.choco.alchema.Alchema$
towtf.choco.alchema.crafting
- Added
RecipeLoadResult#getTimeToComplete() : long