FallingAlchemy
Provide an alchemy system based on physical interaction of falling blocks, supporting highly customizable recipe configurations.
介绍
Falling Alchemy
Provides an alchemy system based on falling block physical interactions, supporting highly customizable recipe configurations.
Core Extension: Deeply integrated with CraftTweaker, supporting probability control, complex condition logic, event listening, and sound effect control.
Demo: https://www.bilibili.com/video/BV1aKJVzsEzo
Features
✅ Core Mechanisms
- Custom falling blocks (Sand/Gravel/Anvil, etc.)
- Detect and replace specified items within range
- Support for multiple output generation and quantity proportion control
⚙️ Advanced Configuration
- Recipe Success Rate (
0.0~1.0) - Block Retention Chance (
0.0~1.0) - Single Processing
- Input protection under falling anvils
- Block displacement detection and extra output calculation
- Detection radius adjustment
- Custom Failure/Success sound effects
- NBT Fuzzy Matching (
fuzzyNBT) - Recipe Execution Priority (
priority)
🌦️ Condition System
- Biome restriction
- Time range (MC Time
0~24000) - Weather state (Clear/Rain/Thunder)
- Height restriction
- Moon phase restriction
Configuration Guide
Quick Start
import mods.fallingalchemy.FallingAlchemy;
import mods.fallingalchemy.ConsumedItem;
// 1. Create ConsumedItem object
val coalReq = FallingAlchemy.createConsumedItem(
<minecraft:coal_ore>.withTag({Unbreakable: 1 as byte}), // Match item
3, // Required count (optional, default 1)
true, // Match NBT (optional, default false)
true // Fuzzy NBT match (optional, default false)
);
// 2. Create Builder
val builder = FallingAlchemy.addConversion(
<minecraft:anvil>, // Trigger block
[coalReq], // Inputs
[<minecraft:diamond>] // Outputs
);
// 3. Chain configuration parameters
builder.setRadius(2.0) // Set radius
.setSingle(true) // Enable single processing (only one recipe per fall event)
.setRescueItems(true) // Enable item protection (prevents remaining coal from being destroyed by the anvil)
.setSuccessChance(0.8) // 80% success rate
.addHeightCondition(0, 60) // Height restriction
.register(); // Register recipe
Method Explanation
FallingAlchemy.addConversion(IItemStack fallingBlock, ConsumedItem[] inputs, IItemStack[] outputs)
Returns a ConversionBuilder object.
Builder Methods
| Method Name | Parameters | Description |
|---|---|---|
setRadius |
double |
Detection radius (Default 2.0) |
setSingle |
boolean |
If true, the recipe executes only once per fall event, preventing consumption of all materials in range. |
setRescueItems |
boolean |
If true, if the input stack size exceeds the requirement, the mod will “rescue” remaining items that would otherwise be destroyed by the falling anvil. |
setPriority |
int |
Priority. Higher values are checked first. |
setSuccessChance |
double |
Success rate (0.0 – 1.0). |
setKeepBlockChance |
double |
Probability that the falling block (e.g., Anvil) does not disappear after alchemy. |
setDisplacement |
double, boolean |
Sets minimum fall distance. The second parameter controls whether extra output is added based on additional distance. |
setSuccessSound |
string, float, float |
Set Success Sound ID, Volume, Pitch. |
setFailureSound |
string, float, float |
Set Failure Sound ID, Volume, Pitch. |
register |
string(Optional) |
Register the recipe. Can pass a string as the recipe ID. |
ConsumedItem Parameters:
IIngredient ingredient: The input itemint requiredCount: Required quantity (Optional, default is 1)bool matchNBT: Whether to strictly match NBT (Optional, default is false)bool fuzzyNBT: When matchNBT=true, only validates if existing tags match (does not check for extra tags) (Optional, default is false)
Script Example
import mods.fallingalchemy.FallingAlchemy;
import mods.fallingalchemy.ConsumedItem;
import mods.fallingalchemy.event.FallingConversionPreEvent;
import mods.fallingalchemy.event.FallingConversionPostEvent;
// Scenario: Anvil falls on "Enchanted Golden Apple" and "Stick named Magic" -> Generates "Nether Star"
val builder = FallingAlchemy.addConversion(
<minecraft:anvil>, // Trigger block
[
// NBT Strict Match Example: Must be Enchanted Golden Apple (Metadata 1)
FallingAlchemy.createConsumedItem(<minecraft:golden_apple:1>, 1),
// NBT + Fuzzy Match Example:
// Requires a stick named "Magic"
// Params: Item, Count(1), MatchNBT(true), FuzzyMatch(true - allows extra tags)
FallingAlchemy.createConsumedItem(<minecraft:stick>.withTag({display: {Name: "Magic"}}), 1, true, true)
],
[<minecraft:nether_star>] // Output
);
// Chain detailed configuration
builder.setRadius(2.5) // Detection radius 2.5 blocks
.setSuccessChance(0.8) // 80% success rate
.setKeepBlockChance(0.0) // Anvil always disappears (0% keep)
.setPriority(100) // High priority, checked before other recipes
.setSingle(true) // Process only one recipe per fall to prevent consuming entire stacks
.setRescueItems(true) // Rescue remaining materials from anvil damage
.setSuccessSound("minecraft:ui.toast.challenge_complete", 1.0, 1.0)
.setFailureSound("minecraft:entity.item.break", 1.0, 0.8)
.addHeightCondition(0, 60) // Can only happen underground (Y < 60)
.addMoonPhaseCondition(0) // Must be Full Moon
.register("apple"); // Register with ID
// Pre Event: Triggered when recipe matches successfully but before items are generated (Can cancel, modify outputs)
events.onFallingConversionPre(function(event as FallingConversionPreEvent) {
if (event.id == "apple") {
// Example: Double rewards if it is raining
if (event.world.raining) {
event.addOutput(<minecraft:nether_star>); // Add an extra Nether Star
}
// Example: Cancel if player is unlucky
if (event.world.random.nextInt(100) < 5) {
event.cancel(); // Cancel execution, items are not consumed
}
}
}
});
// Post Event: Triggered after the recipe has fully executed
events.onFallingConversionPost(function(event as FallingConversionPostEvent) {
// Log the location where alchemy occurred
print(event.position.x ~ "," ~ event.position.y ~ "," ~ event.position.z);
});
Condition System
Condition Types
| Method | Parameter Example | Description |
|---|---|---|
addBiomeCondition |
"minecraft:jungle" |
Limit Biome |
addTimeCondition |
0, 12000 |
Time Range (MC Time) |
addWeatherCondition |
true, false |
Is Raining/Thundering |
addHeightCondition |
60, 128 |
Y-Axis Height Range |
addMoonPhaseCondition |
3 |
Specific Moon Phase (0-7) |
Special Notes:
- Weather condition auto-correction: When
requireThundering=trueis set, it will automatically enable the requirement for rain. - Height condition supports single value mode:
addHeightCondition(100)means trigger at exactly Y=100.
Event System
The mod provides Pre (Before execution) and Post (After execution) events, allowing dynamic control via ZenScript.
Import event classes at the start of your script:
import mods.fallingalchemy.event.FallingConversionPreEvent;
import mods.fallingalchemy.event.FallingConversionPostEvent;
- Pre Event (FallingConversionPreEvent)
Trigger: Recipe matched successfully, just before consumption and output generation.
Usage: Cancel recipe, modify outputs, add extra logic.
| Property (Getter) | Type | Description |
|---|---|---|
| event.id | string |
Recipe ID (if set during register), else empty string. |
| event.fallingBlock | IItemStack |
The falling block triggering this alchemy. |
| event.inputs | ConsumedItem[] |
List of required input items. |
| event.world | IWorld |
The world where the event occurs. |
| event.position | IBlockPos |
The position where the event occurs. |
| event.outputs | List<IItemStack> |
List of outputs to be generated. |
| Method (Setter) | Description |
|---|---|
| event.cancel() | Cancel this alchemy. Items won’t be consumed or generated. |
| event.addOutput(item) | Add a new ItemStack to the output list. |
| event.setOutputs(items) | item[], overrides the current output list. |
- Post Event (FallingConversionPostEvent)
Trigger: After recipe execution is complete and items are generated.
Usage: Logging, statistics, spawning extra effects.
| Property (Getter) | Type | Description |
|---|---|---|
| event.id | string |
Recipe ID. |
| event.fallingBlock | IItemStack |
The triggering falling block. |
| event.inputs | ConsumedItem[] |
List of input items used. |
| event.world | IWorld |
The world where the event occurs. |
| event.position | IBlockPos |
The position where the event occurs. |
| event.outputs | List<IItemStack> |
List of final generated outputs. |
// Pre Event Listener
events.onFallingConversionPre(function(event as FallingConversionPreEvent) {
// Method 1: Check by ID (Recommended)
// Requires using .register("my_recipe_id") during registration
if (event.id == "my_recipe_id") {
if (event.world.raining) {
event.addOutput(<minecraft:slime_ball>); // Extra output when raining
}
return;
}
// Method 2: Check by Falling Block
if (event.fallingBlock.definition.id == "minecraft:anvil") {
// 5% Chance to fail
if (event.world.random.nextInt(100) < 5) {
event.cancel();
print("Alchemy unexpectedly failed!");
}
}
});
// Post Event Listener
events.onFallingConversionPost(function(event as FallingConversionPostEvent) {
print("Alchemy Success! ID: " + event.id + " Pos: " + event.position.x + "," + event.position.y);
});
Sound System
Sound Configuration
// Specify directly in the builder
builder.setSuccessSound("Sound ID", Volume, Pitch);
Sound Parameter Specs:
- Volume Range:
0.1~2.0(Default 1.0) - Pitch Range:
0.5~2.0(Default 1.0) - Resource Format: Use standard Minecraft sound IDs, e.g.,
"minecraft:entity.lightning.thunder"
FAQ
❓ Recipe not triggering
- Confirm the falling block is registered.
- Check if detection radius covers item positions.
- Verify if set conditions are met.
❓ Sound not playing
- Confirm Sound ID is correct (Use F3+H to view item/sound IDs).
- Check if Volume/Pitch parameters are within legal range.
❓ Multiple input matching issues
- Check NBT matching mode of consumed items.
- Ensure total count of all consumed items meets the requirement.
❓ Priority not working
- Check if priority parameter is set (Default 0).
- High priority recipes should have larger values (e.g., 10 > 5).
Todo
- √ Sound effects for alchemy success/failure
- √ Y-Axis limit conditions
- √ Recipe events
- √ Cross-dimension condition support (Temporarily implementable via Biome conditions)
- – Support for “Alchemy” based on the block the falling block lands on (Can be implemented via events)
License: MIT
Feedback: Submit Issue
常见问题
FallingAlchemy 支持哪些 Minecraft 版本?
FallingAlchemy 支持 Minecraft Java 版 1.12.2,可用的加载器:Forge。下载时注意选择和你游戏版本一致的文件。
FallingAlchemy 怎么安装?
先用 PCL2 或 HMCL 启动器安装对应版本的 Forge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。
评论
登录后评论和评分