跳到正文

Create Sifting Fabric – Updated

作者:jiesoon771

A Fabric port of Create Sifting updated to work with Create 6 for Minecraft 1.20.1.Also named differently elsewhere.

收藏

截图

介绍

中文介绍正在准备中,下面暂时显示原文。

喂!看这里!有中文,翻译关一下哈,不然机翻很杂的( •̀ ω •́ )往下翻一翻就到了~不要着急。

English Introduction

Mod Overview

A Fabric port update for Create: Sifting! This is not just a port — it also adds a graphical config screen, a full netherite sifting chain, and many other practical features. It is currently the most feature-complete Create: Sifting adaptation for Fabric 1.20.1!


Key Highlights

1. Fully Graphical Config UI — Rebalancing for Everyone

This mod has long been discussed for its balance issues, so this port includes a full visual config overhaul. No manual config file editing required — even beginners can pick it up easily.

The following features require Mod Menu.

Open the config screen via Pause Menu → Mods → Create:Sifting, and you get:

  1. Change difficulty presets: Five tiers from “Ultra” to “Low”. Switch output efficiency and processing speed with one click, easily fitting casual survival, hardcore modpacks, skyblock, and more.
  2. Per-recipe independent overrides: After entering a world, you can adjust each sifting recipe individually — each output’s drop chance (0–100%) and per-roll count, or add/remove outputs. Changes take effect immediately, no restart needed.
  3. Add recipes: You can add recipes and customize inputs, meshes, and outputs to suit all kinds of needs.
  4. Recipe edit lock: Struggling to stop yourself from changing recipes and difficulty? Lock your recipes!

Enough talk — let’s look at some screenshots:

Module Difficulty
Recipe Editing
Add Recipe

Notes:

All configs are server-authoritative. Dedicated servers automatically sync settings to all clients, so whether you’re playing singleplayer, on a multiplayer server, or making a modpack, you can quickly tune the balance experience you need. Editing recipes and selecting the “Ultra” difficulty require cheat/OP permissions (after all, it’s not much different from enabling creative mode).

2. Full Netherite Sifting Port — High-Tier Gameplay in 1.20.1

This adaptation brings the netherite sifting gameplay that only exists in newer official versions fully to 1.20.1! No other 1.20.1 version of Create: Sifting has this (and honestly, I wanted to play with it, haha).


Not Sure How to Play?

Gameplay and Mod Content

Mechanics and Usage

Basic Operation

  • Power input: The sifter needs rotational power from the side via cogs/gears to operate;
  • Installing a mesh: Right-click the sifter with a mesh in hand to install it;
  • Retrieving items: Right-click with an empty hand to take all outputs; if the output area is empty, it also returns items from the input slot;
  • Removing the mesh: Shift + right-click with an empty hand to remove the currently installed mesh; the mesh is returned to your inventory;
  • Inserting items: You can throw the block to be sifted onto the top of the sifter, or input it via hoppers, chutes, brass funnels, and other automation;
  • Collecting outputs: After sifting, right-click to collect outputs, or extract from the side with automation.

Brass Powered Sifter

The Brass Powered Sifter is the upgraded version of the Powered Sifter:

  • Processes 8 items per cycle for higher throughput;
  • Supports output filtering, allowing you to specify which items are output;
  • Stops working when receiving a redstone signal.

Waterlogged Sifting

Some recipes require the sifter to be “waterlogged” to trigger. Placing the sifter in water, or hand-sifting while in a liquid, counts as waterlogged.

Default Sifting Recipes

This adaptation includes 13 built-in sifting recipes. All recipes default to 500 ticks (25 seconds) processing time and can be adjusted or added to via the config UI. Here is the full list of built-in recipes:

Gravel

  • Andesite Mesh: Copper Nugget 5%, Zinc Nugget 1%, Iron Nugget 1%, Gold Nugget 5%, Coal 10%, Flint 10%;
  • Zinc Mesh: Copper Nugget 5%, Zinc Nugget 2%, Iron Nugget 5%, Gold Nugget 10%, Coal 10%, Lapis Lazuli 5%, Flint 10%, Experience Nugget 10%;
  • Brass Mesh: Crushed Copper Ore 10%, Crushed Zinc Ore 10%, Crushed Gold Ore 5%, Crushed Iron Ore 10%, Lapis Lazuli 10%, Coal 15%, Flint 10%, Experience Nugget 10%;
  • Advanced Brass Mesh: Crushed Copper Ore 10%, Crushed Zinc Ore 10%, Crushed Gold Ore 5%, Crushed Iron Ore 15%, Lapis Lazuli 10%, Diamond 5%, Emerald 2%, Experience Nugget 10%.

Sand

  • String Mesh: Redstone Dust 5%, Bone Meal 40%;
  • Andesite Mesh: Redstone Dust 10%, Bone Meal 40%, Experience Nugget 10%;
  • Zinc Mesh: Redstone Dust 15%, Bone Meal 40%, Experience Nugget 10%;
  • Brass Mesh: Redstone Dust (×2) 25%, Glowstone Dust 10%, Bone Meal 40%, Blaze Powder 5%, Experience Nugget 20%.

Soul Sand

  • Brass Mesh: Nether Quartz 10%, Nether Wart 5%, Experience Nugget 10%;
  • Advanced Brass Mesh: Nether Quartz 45%, Nether Quartz 15%, Nether Wart 10%, Ghast Tear 5%, Experience Nugget 20%.

Dirt (Requires Waterlogged)

  • String Mesh: Kelp 20%, Seagrass 30%, Tube Coral 5%, Brain Coral 5%, Bubble Coral 5%, Fire Coral 5%, Horn Coral 5%.

Crushed Basalt

This is a new recipe added by this adaptation compared with the official 1.20.1 version:

  • Sturdy Mesh: Ancient Debris 2%, Netherite Scrap 1%, Experience Nugget 10%;
  • Advanced Sturdy Mesh: Ancient Debris 5%, Netherite Scrap 2%, Experience Nugget 10%.

The Crushed Basalt recipes and Sturdy Mesh were ported by this adaptation from the newer official version (1.21) to 1.20.1; the official 1.20.1 version does not have this content. Full recipes can also be viewed in-game via JEI.

Added Content

Mod content

Blocks

  • Powered Sifter: Basic sifter, processes 1 item per cycle; stress impact 4su, minimum speed 1 RPM, output capacity 16;
  • Brass Powered Sifter: Advanced sifter, processes 8 items per cycle, supports output filtering and redstone control, pauses processing when receiving a redstone signal; stress impact 8su, minimum speed 16 RPM, output capacity 64;
  • Crushed Basalt: Obtained by crushing Basalt with Crushing Wheels, used to sift nether-related resources;
  • Crushed End Stone: No built-in recipes by default, for modpack developers to add custom sifting recipes via datapacks;
  • Dust Block: No built-in recipes by default, for modpack developers to add custom sifting recipes via datapacks.

Items (Meshes)

Meshes are required for sifting recipes; different meshes yield different outputs.

  • String Mesh;
  • Andesite Mesh;
  • Zinc Mesh;
  • Brass Mesh;
  • Custom Mesh;
  • Sturdy Mesh: Ported from official 1.21;
  • Advanced Brass Mesh;
  • Advanced Sturdy Mesh: Ported from official 1.21;
  • Advanced Custom Mesh.
  • Custom Mesh and Advanced Custom Mesh have no built-in sifting recipes; they are for modpack developers and regular players to add custom recipes.

Requirements

  • Minecraft 1.20.1
  • Fabric Loader 0.17.2 or above
  • Fabric API ≥ 0.92.11+1.20.1
  • Create Fabric ≥ 6.0.8.1+build.1744-mc1.20.1
  • Java 17 ~ 21

Servers and clients must use the same mod file. Clients must also install this mod, Create, and Fabric API, with versions matching the server exactly.

Compatibility

Compatibility

The following data is based on Minecraft 1.20.1 · Create 6.0.8.1+ · Fabric.

Confirmed Compatible (Tested)

  • Core dependencies: Create 6.0.8.1+, Fabric API 0.92.11+, MC 1.20.1, Java 17/21 (tested on both client and dedicated server, including coexistence in a 270+ mod modpack).
  • Optimization/rendering: Sodium 0.5.13, Sodium Extra, Iris 1.7.6, Indium, Lithium, C2ME, ModernFix, FerriteCore, Krypton, CreateBetterFps, EntityCulling, Dynamic FPS, MemoryLeakFix.
  • Functional/utility: JEI 15.20.0.134 (recipes display correctly), Mod Menu 7.2.2, Cloth Config, Controlling, AppleSkin, BetterF3.
  • Ecosystem/content: Twilight Forest, Create: Addition 1.3.4, Create Big Cannons 5.11.4.
  • Other functional mods (load coexistence verified): Carry On, Waystones, Traveler’s Backpack, FTB Ultimine, Inventory Profiles Next, Mouse Tweaks, Double Doors, Falling Leaves, Hardcore Revival, Simply Swords, Chat Heads, Eating Animation, NotEnoughAnimations, IMBlocker, Resolution Control+, LambDynamicLights, Modern UI, Zoomify, TaCZ Refabricated, I18nUpdateMod, AmbientSounds, Presence Footsteps, Sound Physics Remastered, LAN Server Properties, FastQuit, Voice Chat, JeCharacters, Open Parties and Claims, Do a Barrel Roll, Chunky, Continuity, Supplementaries / Amendments (+ Moonlight), Cull Less Leaves, Xaero’s World Map, Terralith, YUNG’s series, Lazydfu, GPUMemLeakFix, fast-ip-ping, etc.

Theoretically Compatible (Based on Official Compatibility Boundaries)

Create ecosystem addons (1.20.1 Fabric, latest versions meeting the Create 6.0.8.1 minimum): Steam ‘n’ Rails 1.7.2+, Copycats+ 3.0.8+, Create Deco 2.1.1, Slice & Dice 3.6.0, Enchantment Industry 2.5.2, Jetpack 4.4.2, Extended Cogwheels 2.1.1+, New Age, Ore Excavation, Power Loader (Fabric) 2.0.3, Diesel Generators [Fabric] 2.1.4, Interactive 1.2.1, Crystal Clear, Numismatics, Utilities, Contraption Terminals, Goggles 6.1.1, Trading Floor, Central Kitchen, Bells & Whistles, Interiors, Design n’ Decor, Dreams & Desires, Copper & Zinc, Ultimine, Oxidized, Pattern Schematics, etc.

Common optimization/utility/library mods: Embeddium, Starlight, Cull Less Leaves, GPUMemLeakFix, Xaero map, JourneyMap, inventory/damage display/voice/localization mods, Architectury, Kotlin for Fabric, YUNG’s API, GeckoLib, Terralith, YUNG’s series, Farmer’s Delight family, Supplementaries (tested), etc.

Recipe viewers: EMI / REI can coexist without conflict, but this mod only implements a JEI plugin; sifter recipes do not display in EMI / REI (JEI 15.20+ recommended).

Unknown Compatibility

  • Mods that deeply modify the recipe system (KubeJS recipe scripts, CraftTweaker family): no integration; theoretically compatible, but loading behavior may be altered;
  • Custom rendering pipelines (Canvas, etc.): compatibility with Create’s Flywheel is determined by Create;
  • Addons that deeply integrate with the kinetic network / block entities (specific Interactive interactions, TFMG, etc.).

Incompatible

| Item | Type | Behavior |
| :— | :— | :— |
| Create 0.5.1 and earlier | Dependency rejection | Loader refuses to start (not a crash) |
| Create 6.0.0 ~ 6.0.8 | Dependency rejection | Requires ≥ 6.0.8.1 |
| OptiFine / OptiFabric | Officially incompatible with Create | Incompatible across all versions |
| Old addons deprecated by Create (railways<1.5.3, copycats≤1.1.1, slice&dice≤3.0.0, jetpack≤4.1.1, enchantment-industry<1.2.16, bigcannons≤0.5.3, diesel≤2.1.3, power-loader≤1.4.2, extendedgears≤2.1.0, interactive<1.1.0, garnished≤1.6.3, etc.) | Create official deprecation | Install latest versions |
| Sodium<0.5.0 / Iris≤1.2.5 / Sound Physics<1.4.5 | Officially incompatible with Create | Use newer versions |
| Original createsifter 0.1.1 | Same modid conflict | Cannot be installed together |

Upgrade notes: If your current Create is 6.0.7~6.0.8, upgrade to 6.0.8.1. Recommended steps:

  1. Delete the old create-fabric-*.jar from mods/, and put in the new (6.0.8.1) jar;
  2. Delete leftover standalone Flywheel, Ponder, Porting Lib (porting_lib_*), Registrate, etc. library files in mods/ — leftover old libraries are the most common source of errors in the Create 6 era;
  3. Check whether other Create addons meet the new minimums (see the incompatible table above, e.g. Railways ≥1.5.3, Copycats >1.1.1, etc.), and upgrade them if needed;
  4. Launch and verify: enter the game and a save, confirm there are no red errors in the logs and addon features work;
  5. Enjoy the game.
Config and Balance

Config and Balance

1. Config System Overview

The mod uses Forge Config API Port (Fabric compatibility layer) to generate three config files in the game’s config/ directory:

| File | Type | Content | Scope |
| :— | :— | :— | :— |
| createsifter-server.toml | SERVER | Difficulty, recipe overrides, recipe editing, netherite toggle | Per-world (see 1.1) |
| createsifter-common.toml | COMMON | Mechanical parameters for both sifters | Global (shared by client/server) |
| createsifter-client.toml | CLIENT | Rendering toggles | Client only |

1.1 Per-World Isolation of Server Config

On first launch, the mod automatically checks config/forgeconfigapiport.toml:

  • If forceGlobalServerConfigs = true (the compatibility layer’s default), it flips it to false and writes the marker comment # createsifter: per-world server configs enabled;
  • If the user later manually changes it back to true, the mod respects that choice and will not override it again because the marker already exists.

Therefore, by default:

  • Singleplayer / LAN: createsifter-server.toml is stored in each save’s serverconfig/ directory (saves/<save>/serverconfig/createsifter-server.toml), independent per world;
  • Dedicated server: stored under the world directory’s serverconfig/;
  • Server config is controlled by the host/server owner; clients on a remote server have read-only access to the config UI (see Section 8).

When packaging, you can preset server configs for new worlds via the defaultconfigs/ directory (configured by forgeconfigapiport.toml‘s defaultConfigsPath).


2. Server Config createsifter-server.toml

Full keys/values (defaults are what a freshly generated file contains):

| Key | Type | Default | Range | Description |
| :— | :— | :— | :— | :— |
| difficulty | Enum | "HIGH" | ULTRA / HIGH / MEDIUM / LOW / CUSTOM | Difficulty preset |
| customChanceMultiplier | Float | 0.6 | 0.05 ~ 1.0 | Output multiplier only when difficulty = custom |
| customTimeMultiplier | Float | 1.5 | 0.1 ~ 10.0 | Time multiplier only when difficulty = custom |
| recipeOverrides | String list | [] | — | Per-recipe, per-output overrides; format see 2.2 |
| customRecipes | String list | [] | — | Recipe file-level edits/additions; format see 2.3 |
| deletedRecipes | String list | [] | — | Deleted built-in recipe IDs |
| recipeEditLocked | Boolean | false | — | Recipe edit lock (permanent semantics see 2.4) |
| enableNetheriteSift | Boolean | true | — | Master toggle for netherite sifting chain |

2.1 Difficulty Presets

Difficulty multipliers apply to all sifting recipes (both machine and hand sifting), resolved at runtime by the Difficulty enum:

| Preset | Output multiplier (chance ×) | Processing time multiplier (time ×) | Notes |
| :— | :—: | :—: | :— |
| ULTRA | ×1.5 | ×0.5 | Easiest; selecting it in the config UI requires cheat/OP permission |
| HIGH | ×1.0 | ×1.0 | Default, equivalent to upstream original behavior |
| MEDIUM | ×0.6 | ×1.5 | |
| LOW | ×0.35 | ×2.0 | Hardest |
| CUSTOM | customChanceMultiplier | customTimeMultiplier | Free adjustment |

Implementation details (Difficulty.java / SiftingRecipe.java):

  • Output multiplier is applied on each drop roll and clamped to ≤1.0: chance = min(1, baseChance × multiplier). Therefore ULTRA’s ×1.5 only affects outputs with base chance < 2/3;
  • Time multiplier applies to the recipe’s base duration: duration = max(1, (int)(baseDuration × multiplier)). Config files and network sync store the base duration; multipliers are only computed at runtime to avoid double multiplication on the client;
  • Valid custom multiplier ranges: output 0.05 ~ 1.0 (default 0.6), time 0.1 ~ 10.0 (default 1.5).

2.2 Per-Recipe Overrides recipeOverrides

Format (one string per entry, separated by |):

<recipeId>|<outputIndex>|<chance0to100>|<count>

Example:

recipeOverrides = ["createsifter:sifting/gravel_andesite_mesh|0|75|3"]

Semantics:

  • recipeId is the recipe ID (built-in ID list see 6.4), outputIndex is the result array index (starting from 0, i.e. JEI output order);
  • chance is an integer percentage from 0~100, count is the per-roll output amount from 1~64 (further clamped by the item’s max stack size when rolling);
  • Overrides take priority over difficulty multipliers: when an override exists, that output’s chance uses the override value directly (no longer multiplied by difficulty), and count uses the override count;
  • Invalid entries (not 4 segments, negative index) are discarded during parsing; out-of-range chances/counts are automatically clamped;
  • Empty list = all overrides disabled. Replacing the entire list triggers cache rebuild and generation increment (cache mechanism see Section 10, item 7).

2.3 Recipe Editing customRecipes / deletedRecipes

Written back by the config UI (recipe editor), but can also be edited manually:

  • customRecipes format per entry: <recipeId>||<json recipe>. If recipeId matches a built-in recipe ID, it replaces that recipe; otherwise it is treated as a new recipe and automatically assigned ID createsifter:custom/<n> (takes current max n + 1);
  • deletedRecipes has one recipe ID per entry, meaning remove that built-in recipe from the recipe table;
  • When a built-in recipe and a custom recipe share the same ID, deletion takes priority over replacement (delete-then-replace logic see ModRecipeTypes.mergeCustom);
  • The config UI provides “Reset All Recipes” to clear all three types of edits in one click and restore built-in defaults;
  • Invalid JSON entries are skipped and logged as warnings; they will not bring down the entire recipe table.

2.4 Recipe Edit Lock recipeEditLocked

  • Enabling it (writing true) requires no permission — any player can lock the world’s recipes to constrain everyone;
  • Once enabled, no one except cheats/OP can modify difficulty, overrides, or recipes; disabling the lock itself also requires cheat/OP permission;
  • The lock is permanent by design: the UI only writes true; the only way to unlock is to manually edit the config file and restart. There is an in-memory mirror (recipeEditLockedMirror) in code, reset when the world loads (SERVER_STARTED), to prevent a lock from one world leaking into a new world.

2.5 Netherite Toggle enableNetheriteSift

Default true. When disabled, drop rolls skip “netherite family” outputs (ancient_debris / netherite_scrap / netherite_ingot, where ingot is reserved for custom recipes), and the built-in Crushed Basalt recipes keep only the Experience Nugget output. This check happens before difficulty multipliers/overrides.


3. Common Config createsifter-common.toml

[sifter]           # Powered Sifter (basic sifter)
stressImpact = 4.0     # Stress impact (su), 0.0 ~ 64.0
outputCapacity = 16    # Output slots, ≥ 1
minimumSpeed = 1.0     # Minimum speed (RPM), 0.0 ~ 254.0

[brass_sifter]     # Brass Powered Sifter
stressImpact = 8.0     # Stress impact (su), 0.0 ~ 64.0
outputCapacity = 64    # Output slots, ≥ 1
itemsPerCycle = 8      # Items processed per cycle, 1 ~ 64
minimumSpeed = 16.0    # Minimum speed (RPM), 0.0 ~ 254.0

Notes:

  • Output capacity only affects newly created block entities (config comment: “applies to newly placed sifters”): output slots are created at block entity construction using the current config; already placed sifters keep their capacity;
  • Items per cycle is configurable only for the Brass Sifter; the normal sifter is fixed at 1;
  • Stress is registered through Create 6’s BlockStressValues.IMPACTS provider, and values are read from config in real time.

4. Client Config createsifter-client.toml

[sifter]
renderSiftedBlock = true   # Render the block being sifted
renderMovingMesh = true    # Render the moving mesh

[brass_sifter]
renderSiftedBlock = true
renderMovingMesh = true

Pure rendering toggles; does not affect logic.


5. Balance Baseline (Machine Behavior and Throughput)

5.1 Mechanical Parameter Comparison of the Two Sifters

| Parameter | Powered Sifter | Brass Powered Sifter |
| :— | :—: | :—: |
| Stress impact | 4.0 su | 8.0 su |
| Minimum speed (idle threshold) | 1 RPM | 16 RPM |
| Output slots | 16 | 64 |
| Items per cycle | 1 | 8 (configurable) |
| Output filtering | None | Yes (FilteringBehaviour, can connect to recipe filtering) |
| Redstone lock | None | Yes (pauses processing when receiving redstone signal; kinetics keep running) |
| Waterlogged property | Yes (WATERLOGGED) | Yes |
| Cogwheel/shaft | Small cogwheel (ICogWheel), shaft facing down | Same as left |

5.2 Processing Rate

  • Progress per tick: clamp(|speed| ÷ 16, 1, 512) (absolute value; rotation direction does not matter);
  • Cycle time (ticks) ≈ base duration × time multiplier ÷ progress per tick, settling when reduced to 0 (timer -= getProcessingSpeed());
  • Built-in recipes all have a base duration of 500 ticks = 25 seconds. Single-cycle time at common speeds (difficulty HIGH):

| Speed | Progress per tick | 500-tick cycle time |
| :—: | :—: | :—: |
| 1 RPM (minimum) | 1 | 500 ticks ≈ 25.0 s |
| 16 RPM | 1 | 500 ticks ≈ 25.0 s |
| 32 RPM | 2 | 250 ticks ≈ 12.5 s |
| 64 RPM | 4 | 125 ticks ≈ 6.3 s |
| 128 RPM | 8 | 63 ticks ≈ 3.2 s |
| 256 RPM (Create limit) | 16 | 32 ticks ≈ 1.6 s |

  • Throughput difference: at the same speed, the Brass Sifter processes 8 items per cycle, meaning its throughput per unit time is 8× that of the normal sifter (e.g. at 16 RPM, normal sifter: 1 item/25 s; Brass Sifter: 8 items/25 s, i.e. one item every 3.125 s).

5.3 Runtime Semantics of Minimum Speed (Important)

The block entity’s minimumSpeed field switches as follows:

  • Idle/no matching recipe: uses the block default — normal sifter 1 RPM, Brass Sifter 16 RPM (below this, not even recipe search is performed);
  • After a recipe is matched: switches to the recipe’s minimumSpeed field (defaults to 1 if unset in JSON). Therefore, after the Brass Sifter first matches above 16 RPM, it can continue running at speeds as low as 1 RPM;
  • The recipe-level hasSpeedRequirement() check is based on the normal sifter’s configured default (1.0): only when a recipe has minimumSpeed > 1 does it impose an additional speed threshold. Built-in recipes do not set this field, so they impose no extra threshold.

6. Sifting Recipe System

6.1 Recipe JSON Format

Recipe type createsifter:sifting, placed in datapack data/<namespace>/recipes/sifting/*.json (or any path, vanilla rules). Fields:

| Field | Type | Default | Description |
| :— | :— | :—: | :— |
| type | String | Required | createsifter:sifting |
| ingredients | Array | Required | Recipe ingredients. Order-independent: automatically categorized by item type — the first “mesh-type item” is the mesh, the first “non-mesh item” is the siftable; remaining entries are ignored during matching |
| results | Array | Required | Results. Each entry: { "item": id, "chance": 0~1, "count": amount (default 1) } |
| processingTime | Integer | 0 | Base processing time (ticks), multiplied by difficulty time multiplier at runtime |
| waterlogged | Boolean | false | Whether waterlogged is required (see 6.2) |
| minimumSpeed | Float | 1 | Recipe-level minimum speed requirement (see 5.3) |

Example (full structure of built-in sand_brass_mesh):

{
  "type": "createsifter:sifting",
  "ingredients": [
    { "item": "minecraft:sand" },
    { "item": "createsifter:brass_mesh" }
  ],
  "processingTime": 500,
  "results": [
    { "chance": 0.25, "count": 2, "item": "minecraft:redstone" },
    { "chance": 0.1, "item": "minecraft:glowstone_dust" },
    { "chance": 0.4, "item": "minecraft:bone_meal" },
    { "chance": 0.05, "item": "minecraft:blaze_powder" },
    { "chance": 0.2, "item": "create:experience_nugget" }
  ]
}
  • Mesh ingredients support item IDs and tags (e.g. #createsifter:meshes);
  • Datagen (SiftingRecipeBuilder) supports whenModLoaded / whenModMissing conditions; results include a conditions field, evaluated at load time by Fabric’s resource condition mechanism;
  • Datapack recipes are loaded through the vanilla flow after the server RecipeManager rebuilds (startup / /reload).

6.2 Recipe Matching Rules

A recipe matches during machine/hand sifting only when all of the following are satisfied:

  1. Ingredients: input slot (slot 0) matches the siftable, mesh slot (slot 1) matches the mesh;
  2. Waterlogged: recipe.waterlogged == sifter's current waterlogged state. Note that among built-in recipes, only the dirt recipe has waterlogged: true; the rest default to false — meaning a waterlogged sifter will not run sand/gravel/soul sand/basalt recipes;
  3. Speed: if the recipe has an extra speed requirement (minimumSpeed > 1), |speed| ≥ requirement;
  4. Advanced mesh mutual exclusion: if an advanced mesh is installed in the sifter, recipes whose mesh ingredient resolves to a normal mesh (BaseMesh) as the first stack will not match; conversely, a normal mesh cannot match advanced mesh ingredients either (ingredient matching itself is already mutually exclusive; this rule provides a fallback for custom recipes/tag-based mesh ingredients). The deciding condition is “the mesh installed in the sifter”, regardless of sifter type — a normal Powered Sifter with an advanced mesh will also only run advanced recipes.

6.3 Full Built-in Sifting Recipe Table (13)

All base duration 500 ticks; chances are per-roll probabilities, and a recipe can have multiple independent rolls (each cycle, each input item rolls independently for each output).

Gravel

| Recipe ID | Mesh | Outputs and Chances |
| :— | :— | :— |
| gravel_andesite_mesh | Andesite | Copper Nugget 5% · Zinc Nugget 1% · Iron Nugget 1% · Gold Nugget 5% · Coal 10% · Flint 10% |
| gravel_zinc_mesh | Zinc | Copper Nugget 5% · Zinc Nugget 2% · Iron Nugget 5% · Gold Nugget 10% · Coal 10% · Lapis Lazuli 5% · Flint 10% · Experience Nugget 10% |
| gravel_brass_mesh | Brass | Crushed Copper Ore 10% · Crushed Zinc Ore 10% · Crushed Gold Ore 5% · Crushed Iron Ore 10% · Lapis Lazuli 10% · Coal 15% · Flint 10% · Experience Nugget 10% |
| gravel_advanced_brass_mesh | Advanced Brass | Crushed Copper Ore 10% · Crushed Zinc Ore 10% · Crushed Gold Ore 5% · Crushed Iron Ore 15% · Lapis Lazuli 10% · Diamond 5% · Emerald 2% · Experience Nugget 10% |

Sand

| Recipe ID | Mesh | Outputs and Chances |
| :— | :— | :— |
| sand_string_mesh | String | Redstone Dust 5% · Bone Meal 40% |
| sand_andesite_mesh | Andesite | Redstone Dust 10% · Bone Meal 40% · Experience Nugget 10% |
| sand_zinc_mesh | Zinc | Redstone Dust 15% · Bone Meal 40% · Experience Nugget 10% |
| sand_brass_mesh | Brass | Redstone Dust (×2) 25% · Glowstone Dust 10% · Bone Meal 40% · Blaze Powder 5% · Experience Nugget 20% |

Soul Sand

| Recipe ID | Mesh | Outputs and Chances |
| :— | :— | :— |
| soul_sand_brass_mesh | Brass | Nether Quartz 10% · Nether Wart 5% · Experience Nugget 10% |
| soul_sand_advanced_brass_mesh | Advanced Brass | Nether Quartz 45% + 15% two independent rolls · Nether Wart 10% · Ghast Tear 5% · Experience Nugget 20% |

Dirt (Must Be Waterlogged)

| Recipe ID | Mesh | Outputs and Chances |
| :— | :— | :— |
| dirt_string_mesh_waterlogged | String | Kelp 20% · Seagrass 30% · Tube Coral 5% · Brain Coral 5% · Bubble Coral 5% · Fire Coral 5% · Horn Coral 5% |

Crushed Basalt (Netherite Chain, ported in this branch from upstream 1.21)

| Recipe ID | Mesh | Outputs and Chances |
| :— | :— | :— |
| crushed_basalt_sturdy | Sturdy | Ancient Debris 2% · Netherite Scrap 1% · Experience Nugget 10% |
| crushed_basalt_advance_sturdy | Advanced Sturdy | Ancient Debris 5% · Netherite Scrap 2% · Experience Nugget 10% |

Precursor chain: Basalt → (create:crushing Crushing Wheels, 250 ticks) / (create:milling Millstone, 250 ticks) → createsifter:crushed_basalt.

6.4 Built-in Recipe ID List

createsifter:sifting/ prefix:

gravel_andesite_mesh          gravel_zinc_mesh            gravel_brass_mesh
gravel_advanced_brass_mesh    sand_string_mesh            sand_andesite_mesh
sand_zinc_mesh                sand_brass_mesh             soul_sand_brass_mesh
soul_sand_advanced_brass_mesh dirt_string_mesh_waterlogged
crushed_basalt_sturdy         crushed_basalt_advance_sturdy

Other IDs: machine crafting createsifter:sifter, createsifter:brass_sifter; mesh crafting createsifter:string_mesh, andesite_mesh, zinc_mesh, brass_mesh, sturdy_mesh, advanced_brass_mesh, advanced_sturdy_mesh; basalt processing createsifter:crushing/basalt, createsifter:milling/crushed_basalt.

6.5 Meshes and Placeholder Blocks

  • 9 meshes (all unstackable): string_mesh, andesite_mesh, zinc_mesh, brass_mesh, custom_mesh, advanced_brass_mesh, advanced_custom_mesh, sturdy_mesh, advanced_sturdy_mesh. custom_mesh and advanced_custom_mesh have no built-in recipes and are intended for datapacks; all meshes are added to the tag #createsifter:meshes;
  • Placeholder blocks: crushed_end_stone, dust have no built-in recipes and are for modpacks to add custom sifting chains (block-type siftables must be blocks — the config UI’s new recipe screen only accepts block types, corresponding lang key requires_block);
  • Advanced meshes have no type restriction: both normal and Brass Sifters can install them (unlike the upstream Forge version’s Brass Sifter-only restriction).

6.6 Expected Output Quick Reference (per 1 input consumed, difficulty HIGH)

Not weighted by output value; count=2 is included (0.25×2=0.5).

| Recipe | Expected outputs/input | Brass Sifter per cycle (×8) |
| :— | :—: | :—: |
| Gravel · Andesite | 0.32 | — |
| Gravel · Zinc | 0.57 | — |
| Gravel · Brass | 0.80 | 6.40 |
| Gravel · Advanced Brass | 0.67 | 5.36 |
| Sand · String | 0.45 | — |
| Sand · Andesite | 0.60 | — |
| Sand · Zinc | 0.65 | — |
| Sand · Brass | 1.25 | 10.00 |
| Soul Sand · Brass | 0.25 | 2.00 |
| Soul Sand · Advanced Brass | 0.95 | 7.60 |
| Dirt · String (waterlogged) | 0.75 | — |
| Crushed Basalt · Sturdy | 0.13 | — |
| Crushed Basalt · Advanced Sturdy | 0.17 | — |


7. Runtime Drop Rolls and Priority

In a single cycle, each input item independently performs a roll for each recipe output (SiftingRecipe.rollResults):

chance = min(1, baseChance × difficultyOutputMultiplier)
If hit: output count items (default 1)

Priority (high to low):
1. recipeOverrides override (chance/count use override values directly, no difficulty multiplier)
2. Difficulty output multiplier
3. Recipe base chance/count
Also: when enableNetheriteSift=false, netherite-family outputs are skipped before any roll
  • Rolls use a static shared RandomSource, only allowed on the game thread (drops and hand sifting are both on the server thread);
  • Overflow handling: when outputs cannot fit into output slots they are not destroyed — outputs rejected by the Brass Sifter’s output filter and overflow that doesn’t fit will drop above the sifter; when all output slots are full, the machine goes idle (stops advancing the timer) and automatically resumes when space is freed;
  • The Brass Sifter’s output filter (filter slots) can connect to recipe filtering (forRecipes); filtered-out outputs also drop instead of disappearing;
  • Hand sifting (BaseMesh): hold for 32 ticks to complete one operation; standing in a liquid block counts as waterlogged; sifted items go directly into the inventory (or drop for fake players); the code path calls hurtAndBreak(1), but meshes are registered with no durability (maxDamage=0), so they never actually break.

8. Permissions and Multiplayer Behavior

Permission check (canCheat()): granted in singleplayer/LAN host when the world allows cheats (or “Allow Cheats” is checked when opening to LAN); for remote connections, determined by permission level ≥ 2 (OP).

| Action | Permission requirement |
| :— | :— |
| View config UI | None; on a remote server the entire UI is read-only (“Server config wins” / “Cannot edit on a remote server”) |
| Change difficulty (except ULTRA) | No cheat requirement (subject to recipe lock and remote read-only; players without cheat permission can only change difficulty) |
| Select ULTRA difficulty | Requires cheat/OP |
| Per-recipe overrides (change chance/count) | Requires cheat/OP (via recipe editor UI) |
| Edit / create / delete recipes | Requires cheat/OP |
| Enable recipe edit lock | None (any player can lock) |
| Disable recipe edit lock | Cannot be disabled in UI (permanent lock); only by manually editing the config file and restarting |

  • Recipe edits/overrides are written to server config and injected into the server RecipeManager in real time, then sent via vanilla sync: online players (including hand-sift prediction and JEI display) immediately see a consistent recipe table without relogging;
  • During datapack /reload, there is dedicated baseline protection (baselineDirty flag): after reload, the “pure datapack baseline” is recollected before merging injections, avoiding incorrectly rolling back old edits or double-merging (see ModRecipeTypes comments and event order for details);
  • The config UI supports session-level cancel: when opening the UI, all editable items are snapshotted; Cancel restores them all at once (the recipe lock is not in the snapshot — it must remain permanent).

This document is based on V1.1.0 source (SifterConfig / BrassSifterConfig / Difficulty / SiftingRecipe / SifterBlockEntity / ModRecipeTypes / CustomRecipeStore, etc.) and runtime-generated config files; if any values differ from in-game, the actual loaded config files and resources inside the jar take precedence.


License and Credits

This version is a community-maintained, unofficial Fabric port. The original mod was developed by oierbravo, with the first Fabric port by Shulej. This adaptation deeply iterates on the existing port and resolves API compatibility issues with Create 6.0.8.1.

  • License: LGPL-3.0
  • Original author: oierbravo (official Forge version)
  • First Fabric port: Shulej
  • This community adaptation and new features: jiesoon771

Note: The furthest upstream, oierbravo, uses LGPL-3.0 (Forge version); the Fabric source repository this adaptation is based on (Shulej) claims MIT. To align as fully as possible with the upstream licensing chain, this adaptation is released as a whole under LGPL-3.0. This adaptation retains all upstream notices.

This project is provided “AS-IS” without warranties of any kind. Basic functionality has been verified, but bugs may still exist. The author does not guarantee future updates or long-term maintenance; use at your own risk.

Thanks to oierbravo, Shulej, and the Create development team!


Download and Source


中文介绍

模组简介

《机械动力:筛子》的fabric移植版更新!不止有移植,更新增了图形化配置界面、下界合金筛选链路等大量实用功能,是目前 1.20.1 Fabric 端功能最完整的《机械动力:筛子》适配版本!


核心亮点

一、全图形化配置界面,平衡调节零门槛

专门针对该模组长期受讨论的平衡性问题,做了全套可视化配置升级!全程不用手动编辑配置文件,新手也能轻松上手。

以下功能需要Mod Menu

通过暂停菜单→Mods→Create:Sifting进入配置界面,即可拥有:

  1. 更改难度预设:从「超高」到「低」的 5 档难度,一键切换产出效率与加工速度,轻松适配休闲生存、硬核整合包和空岛生存等不同玩法。
  2. 逐配方独立覆盖:进入存档后就能针对每一条筛选配方,单独调整每个产物的掉落概率(0–100%)与单次掉落数量,或是添加、删除产物。修改即时生效,无需重启游戏。
  3. 新增配方:您可以新增配方,自定义原材料、筛网和产物,来适配各种需求。
  4. 锁定配方更改功能:还在为控制不住自己改配方、难度而无法自律而痛苦吗?来锁定配方吧!

说了这么多,让我们来看看图吧:

Mod Difficulty Settings Interface
Edit Recipe
Create Recipe

提示:

所有配置以服务端为准,专用服务器会自动同步设置到所有客户端,无论是单机生存还是联机服务器、整合包制作,都能快速调出最贴合需求的平衡体验。更改配方以及难度“超高”需要作弊权限(毕竟和开创造没啥区别:比如,您可以将原材料设为土块,产出为64个下界合金块……哦天呐)

二、下界合金筛选完整移植,1.20.1 解锁高阶玩法

本次适配把官方更高版本才有的下界合金筛选玩法完整带到了 1.20.1!这是所有《机械动力:筛子》的1.20.1版本所没有的(其实是我想玩嘿嘿)。


不知道怎么玩?

去MC百科看看

玩法与模组内容

机制与使用

基本操作

  • 动力输入:筛子需要通过齿轮从侧面获取动力才能运转;
  • 安装筛网:手持筛网右键点击筛子即可安装;
  • 取出物品:空手右键取出全部产物;若输出区为空,则同时取回输入槽中的物品;
  • 取下筛网:空手按住 Shift + 右键可取下当前安装的筛网,筛网返还背包;
  • 投入物品:可直接将待筛选方块投掷到筛子顶部,或通过漏斗、溜槽、黄铜漏斗等自动化设备输入;
  • 获取产物:筛选完成后可右键取出产物,也可通过自动化设备从侧面提取。

黄铜动力筛子

黄铜动力筛子是动力筛子的进阶版本:

  • 每次循环可同时处理 8 个物品,处理效率更高;
  • 支持输出过滤,可指定只输出特定物品;
  • 受到红石信号时停止工作。

含水筛选

部分配方需要筛子处于“含水”状态才能触发。将筛子放置在水中,或手持筛网在液体中筛选时,即视为含水状态。

筛选默认配方

该适配版内置 13 条筛选配方,所有配方默认处理时间为 500 Tick(25 秒),可通过配置界面调整以及添加新配方。以下为完整内置配方列表:

沙砾

  • 安山筛网:铜粒 5%、锌粒 1%、铁粒 1%、金粒 5%、煤炭 10%、燧石 10%;
  • 锌筛网:铜粒 5%、锌粒 2%、铁粒 5%、金粒 10%、煤炭 10%、青金石 5%、燧石 10%、经验颗粒 10%;
  • 黄铜筛网:粉碎铜矿石 10%、粉碎锌矿石 10%、粉碎金矿石 5%、粉碎铁矿石 10%、青金石 10%、煤炭 15%、燧石 10%、经验颗粒 10%;
  • 高级黄铜筛网:粉碎铜矿石 10%、粉碎锌矿石 10%、粉碎金矿石 5%、粉碎铁矿石 15%、青金石 10%、钻石 5%、绿宝石 2%、经验颗粒 10%。

沙子

  • 线筛网:红石粉 5%、骨粉 40%;
  • 安山筛网:红石粉 10%、骨粉 40%、经验颗粒 10%;
  • 锌筛网:红石粉 15%、骨粉 40%、经验颗粒 10%;
  • 黄铜筛网:红石粉(×2)25%、荧石粉 10%、骨粉 40%、烈焰粉 5%、经验颗粒 20%。

灵魂沙

  • 黄铜筛网:下界石英 10%、下界疣 5%、经验颗粒 10%;
  • 高级黄铜筛网:下界石英 45%、下界石英 15%、下界疣 10%、恶魂之泪 5%、经验颗粒 20%。

泥土(需含水)

  • 线筛网:海带 20%、海草 30%、管珊瑚 5%、脑纹珊瑚 5%、气泡珊瑚 5%、火珊瑚 5%、鹿角珊瑚 5%。

粉碎玄武岩

此为该适配模组对比官方 1.20.1 版本的新增配方:

  • 耐固筛网:远古残骸 2%、下界合金碎片 1%、经验颗粒 10%;
  • 高级耐固筛网:远古残骸 5%、下界合金碎片 2%、经验颗粒 10%。

粉碎玄武岩相关配方及耐固筛网为该适配版从官方新版(1.21)移植至 1.20.1,官方原版 1.20.1 无此内容。完整配方也可在游戏内通过 JEI 查看。

添加的内容

Mod content

方块

  • 动力筛子(Sifter):基础筛子,每次循环处理 1 个物品;应力影响 4su,最低转速 1 RPM,输出容量 16;
  • 黄铜动力筛子(Brass Sifter):高级筛子,每次循环处理 8 个物品,支持输出过滤与红石控制,受到红石信号时暂停加工;应力影响 8su,最低转速 16 RPM,输出容量 64;
  • 粉碎玄武岩(Crushed Basalt):可通过粉碎轮粉碎玄武岩获得,用于筛选下界相关资源;
  • 粉碎末地石(Crushed End Stone):默认无内置配方,供整合包开发者通过数据包添加自定义筛选配方;
  • 尘土方块(Dust):默认无内置配方,供整合包开发者通过数据包添加自定义筛选配方。

物品(筛网)

筛网是筛选配方的必要,不同筛网可筛选出不同的产物。

  • 线筛网(String Mesh);
  • 安山筛网(Andesite Mesh);
  • 锌筛网(Zinc Mesh);
  • 黄铜筛网(Brass Mesh);
  • 自定义筛网(Custom Mesh);
  • 耐固筛网(Sturdy Mesh):从官方 1.21 移植;
  • 高级黄铜筛网(Advanced Brass Mesh);
  • 高级耐固筛网(Advanced Sturdy Mesh):从官方 1.21 移植;
  • 高级自定义筛网(Advanced Custom Mesh)。
  • 自定义筛网与高级自定义筛网无内置筛选配方,供整合包开发者和普通玩家添加自定义配方。

运行要求

  • Minecraft 1.20.1
  • Fabric Loader 0.17.2 及以上
  • Fabric API ≥ 0.92.11+1.20.1
  • Create Fabric ≥ 6.0.8.1+build.1744-mc1.20.1
  • Java 17 ~ 21

服务器与客户端需使用同一模组文件,客户端必须同步安装本模组、机械动力与 Fabric API,版本需与服务器完全一致。

兼容性

兼容性

以下数据基于 Minecraft 1.20.1 · Create 6.0.8.1+ · Fabric 环境整理。

确认兼容(实测)

  • 核心依赖:Create 6.0.8.1+、Fabric API 0.92.11+、MC 1.20.1、Java 17/21(客户端与专用服务器均已实测,含 270+ 模组整合包加载共存验证)。
  • 优化/渲染:Sodium 0.5.13、Sodium Extra、Iris 1.7.6、Indium、Lithium、C2ME、ModernFix、FerriteCore、Krypton、CreateBetterFps、EntityCulling、Dynamic FPS、MemoryLeakFix。
  • 功能/辅助:JEI 15.20.0.134(配方正常显示)、Mod Menu 7.2.2、Cloth Config、Controlling、AppleSkin、BetterF3。
  • 生态/内容:暮色森林、Create: Addition 1.3.4、Create Big Cannons 5.11.4。
  • 其他功能模组(加载共存验证通过):Carry On、Waystones、Traveler’s Backpack、FTB Ultimine、Inventory Profiles Next、Mouse Tweaks、Double Doors、Falling Leaves、Hardcore Revival、Simply Swords、Chat Heads、Eating Animation、NotEnoughAnimations、IMBlocker、Resolution Control+、LambDynamicLights、Modern UI、Zoomify、TaCZ Refabricated、I18nUpdateMod、AmbientSounds、Presence Footsteps、Sound Physics Remastered、LAN Server Properties、FastQuit、Voice Chat、JeCharacters、Open Parties and Claims、Do a Barrel Roll、Chunky、Continuity、Supplementaries / Amendments(+ Moonlight)、Cull Less Leaves、Xaero’s World Map、Terralith、YUNG’s 系列、Lazydfu、GPUMemLeakFix、fast-ip-ping 等。

理论兼容(基于官方兼容边界推导)

Create 生态附属(1.20.1 Fabric,最新版本满足 Create 6.0.8.1 下限):Steam ‘n’ Rails 1.7.2+、Copycats+ 3.0.8+、Create Deco 2.1.1、Slice & Dice 3.6.0、Enchantment Industry 2.5.2、Jetpack 4.4.2、Extended Cogwheels 2.1.1+、New Age、Ore Excavation、Power Loader (Fabric) 2.0.3、Diesel Generators [Fabric] 2.1.4、Interactive 1.2.1、Crystal Clear、Numismatics、Utilities、Contraption Terminals、Goggles 6.1.1、Trading Floor、Central Kitchen、Bells & Whistles、Interiors、Design n’ Decor、Dreams & Desires、Copper & Zinc、Ultimine、Oxidized、Pattern Schematics 等。

常见优化/辅助/库模组:Embeddium、Starlight、Cull Less Leaves、GPUMemLeakFix、Xaero 地图、JourneyMap、背包/伤害显示/语音/汉化类、Architectury、Kotlin for Fabric、YUNG’s API、GeckoLib、Terralith、YUNG’s 系列、农夫乐事系、Supplementaries(已实测)等。

配方查看器:EMI / REI 可共存不冲突,但本模组只实现 JEI 插件,筛子配方在 EMI / REI 中不显示(建议使用 JEI 15.20+)。

兼容性未知

  • 深度修改配方系统的模组(KubeJS 配方脚本、CraftTweaker 系):无集成,理论共存,但加载行为可能被干预;
  • 自定义渲染管线(Canvas 等):与 Create 的 Flywheel 兼容性由 Create 侧决定;
  • 深度集成动力网络 / 方块实体的 Create 附加(Interactive 具体交互、TFMG 等)。

不兼容

| 项 | 类型 | 表现 |
| :— | :— | :— |
| Create 0.5.1 及更早 | 依赖拒绝 | 加载器拒绝启动(非崩溃) |
| Create 6.0.0 ~ 6.0.8 | 依赖拒绝 | 需 ≥ 6.0.8.1 |
| OptiFine / OptiFabric | Create 官方不兼容 | 全版本不兼容 |
| 被 Create 淘汰的旧版附加(railways<1.5.3、copycats≤1.1.1、slice&dice≤3.0.0、jetpack≤4.1.1、enchantment-industry<1.2.16、bigcannons≤0.5.3、diesel≤2.1.3、power-loader≤1.4.2、extendedgears≤2.1.0、interactive<1.1.0、garnished≤1.6.3 等) | Create 官方淘汰 | 安装最新版 |
| Sodium<0.5.0 / Iris≤1.2.5 / Sound Physics<1.4.5 | Create 官方不兼容 | 使用新版 |
| 原版 createsifter 0.1.1 | 同 modid 冲突 | 不可同时安装 |

升级提示:若当前 Create 为 6.0.7~6.0.8,需升级到 6.0.8.1,建议按以下步骤操作:

  1. 从 mods/ 删除旧的 create-fabric-*.jar,放入新版(6.0.8.1)jar;
  2. 删除 mods/ 中残留的独立 Flywheel、Ponder、Porting Lib(porting_lib_*)、Registrate 等库文件——残留旧库是 Create 6 时代最常见的报错源头;
  3. 检查其他 Create 附加是否满足新下限(见上文不兼容表,如 Railways ≥1.5.3、Copycats >1.1.1 等),如有需要一并升级;
  4. 启动验证:进入游戏并进入存档,确认日志无红色报错、各附加功能正常;
  5. 尽情享受游戏。
配置与平衡

配置与平衡

1. 配置体系总览

模组通过 Forge Config API Port(Fabric 侧兼容层)生成三个配置文件,位于游戏 config/ 目录:

| 文件 | 类型 | 内容 | 作用域 |
| :— | :— | :— | :— |
| createsifter-server.toml | SERVER | 难度、配方覆盖、配方编辑、下界合金开关 | 按世界隔离(见 1.1) |
| createsifter-common.toml | COMMON | 两种筛子的机械参数 | 全局(客户端/服务端共享) |
| createsifter-client.toml | CLIENT | 渲染开关 | 仅客户端 |

1.1 服务端配置的按世界隔离

本模组在首次启动时自动检查 config/forgeconfigapiport.toml:

  • 若 forceGlobalServerConfigs = true(该兼容层的默认值),会将其翻转为 false 并写入标记注释 # createsifter: per-world server configs enabled;
  • 若用户之后手动改回 true,因标记已存在,模组尊重该选择,不再覆盖。

因此默认情况下:

  • 单机 / 局域网:createsifter-server.toml 保存在每个存档的 serverconfig/ 目录(saves/<存档>/serverconfig/createsifter-server.toml),各世界独立;
  • 专用服务器:保存在世界目录的 serverconfig/ 下;
  • 服务端配置由主机/服主主导,客户端在远程服务器上对配置界面只读(见第 8 节)。

打包时可通过 defaultconfigs/ 目录(forgeconfigapiport.toml 的 defaultConfigsPath 配置)为新世界预置服务端配置。


2. 服务端配置 createsifter-server.toml

完整键值(默认值即全新生成的文件内容):

| 键 | 类型 | 默认值 | 范围 | 说明 |
| :— | :— | :— | :— | :— |
| difficulty | 枚举 | "HIGH" | ULTRA / HIGH / MEDIUM / LOW / CUSTOM | 难度预设 |
| customChanceMultiplier | 浮点 | 0.6 | 0.05 ~ 1.0 | 仅 difficulty = custom 时的产出倍率 |
| customTimeMultiplier | 浮点 | 1.5 | 0.1 ~ 10.0 | 仅 difficulty = custom 时的时间倍率 |
| recipeOverrides | 字符串列表 | [] | — | 逐配方逐产物覆盖,格式见 2.2 |
| customRecipes | 字符串列表 | [] | — | 配方文件级编辑/新增,格式见 2.3 |
| deletedRecipes | 字符串列表 | [] | — | 被删除的内置配方 ID |
| recipeEditLocked | 布尔 | false | — | 配方编辑锁(永久性语义见 2.4) |
| enableNetheriteSift | 布尔 | true | — | 下界合金筛选链总开关 |

2.1 难度预设

难度倍率作用于所有筛选配方(机器与手持筛滤共用),运行时按 Difficulty 枚举解析:

| 预设 | 产出倍率(chance ×) | 处理时间倍率(time ×) | 备注 |
| :— | :—: | :—: | :— |
| ULTRA | ×1.5 | ×0.5 | 最易;在配置界面选择需要作弊/OP 权限 |
| HIGH | ×1.0 | ×1.0 | 默认,等价于上游原版行为 |
| MEDIUM | ×0.6 | ×1.5 | |
| LOW | ×0.35 | ×2.0 | 最难 |
| CUSTOM | customChanceMultiplier | customTimeMultiplier | 自由调节 |

实现细节(Difficulty.java / SiftingRecipe.java):

  • 产出倍率在每次掉落判定时应用,且钳制到 ≤1.0:chance = min(1, baseChance × multiplier)。因此 ULTRA 的 ×1.5 只对基础概率 < 2/3 的产物生效;
  • 时间倍率应用于配方基础时长:duration = max(1, (int)(baseDuration × multiplier))。配置文件与网络同步中保存的是基础时长,倍率仅在运行时计算,避免客户端二次乘算;
  • 自定义倍率的合法区间:产出 0.05 ~ 1.0(默认 0.6)、时间 0.1 ~ 10.0(默认 1.5)。

2.2 逐配方覆盖 recipeOverrides

格式(每条一个字符串,| 分隔):

<recipeId>|<outputIndex>|<chance0to100>|<count>

示例:

recipeOverrides = ["createsifter:sifting/gravel_andesite_mesh|0|75|3"]

语义:

  • recipeId 为配方 ID(内置 ID 清单见 6.4),outputIndex 为结果数组下标(从 0 开始,即 JEI 中产物顺序);
  • chance 为 0~100 的整数百分比,count 为 1~64 的单次产出数量(滚动时再按物品最大堆叠上限钳制);
  • 覆盖优先级高于难度倍率:存在覆盖时,该产物的概率直接用覆盖值(不再乘难度倍率),数量用覆盖数量;
  • 解析时丢弃格式非法(非 4 段、下标为负)的条目;概率/数量越界自动钳制;
  • 空列表 = 关闭全部覆盖。列表被整个替换时触发缓存重建与 generation 递增(缓存机制见第 10 节第 7 条)。

2.3 配方编辑 customRecipes / deletedRecipes

由配置界面(配方编辑器)写回,也可手工编辑:

  • customRecipes 每条格式:<recipeId>||<json配方>。若 recipeId 与内置配方 ID 相同,则替换该配方;否则视为新增配方,自动分配 ID createsifter:custom/<n>(取现存最大 n + 1);
  • deletedRecipes 每条一个配方 ID,表示从配方表中移除该内置配方;
  • 内置配方与自定义配方同 ID 时,删除优先于替换(先删后替的逻辑见 ModRecipeTypes.mergeCustom);
  • 配置界面提供「Reset All Recipes」一键清空以上三类编辑,恢复内置默认;
  • 非法 JSON 条目会被跳过并记录 warning,不会拖垮整个配方表。

2.4 配方编辑锁 recipeEditLocked

  • 开启(写 true)不需要任何权限——任意玩家都可以锁定世界配方来约束所有人;
  • 开启后,除作弊/OP 外无人能修改难度、覆盖与配方;关闭锁本身也需要作弊/OP 权限;
  • 锁定是永久性设计:界面只写入 true,解锁的唯一途径是手动编辑配置文件并重启。代码中存在内存镜像(recipeEditLockedMirror),世界加载时(SERVER_STARTED)重置,防止上个世界的锁泄漏到新世界。

2.5 下界合金开关 enableNetheriteSift

默认 true。关闭后,掉落判定会跳过「下界合金族」产物(ancient_debris / netherite_scrap / netherite_ingot,其中 ingot 为自定义配方预留),内置的粉碎玄武岩配方仅保留经验颗粒产出。该检查发生在难度倍率/覆盖之前。


3. 公共配置 createsifter-common.toml

[sifter]           # 动力筛子(基础筛子)
stressImpact = 4.0     # 应力影响(su),0.0 ~ 64.0
outputCapacity = 16    # 输出槽位数,≥ 1
minimumSpeed = 1.0     # 最低转速(RPM),0.0 ~ 254.0

[brass_sifter]     # 黄铜动力筛子
stressImpact = 8.0     # 应力影响(su),0.0 ~ 64.0
outputCapacity = 64    # 输出槽位数,≥ 1
itemsPerCycle = 8      # 每周期处理物品数,1 ~ 64
minimumSpeed = 16.0    # 最低转速(RPM),0.0 ~ 254.0

说明:

  • 输出容量只影响新建的方块实体(配置注释原文 “applies to newly placed sifters”):输出槽在方块实体构造时按当前配置创建,已放置的筛子容量不变;
  • 每周期处理数仅黄铜筛子可配,普通筛子固定为 1;
  • 应力通过 Create 6 的 BlockStressValues.IMPACTS 提供者注册,数值实时读取配置。

4. 客户端配置 createsifter-client.toml

[sifter]
renderSiftedBlock = true   # 渲染被筛方块
renderMovingMesh = true    # 渲染移动中的筛网

[brass_sifter]
renderSiftedBlock = true
renderMovingMesh = true

纯渲染开关,不影响逻辑。


5. 平衡基线(机器行为与吞吐)

5.1 两种筛子的机械参数对比

| 参数 | 动力筛子 Sifter | 黄铜动力筛子 Brass Sifter |
| :— | :—: | :—: |
| 应力影响 | 4.0 su | 8.0 su |
| 最低转速(空闲阈值) | 1 RPM | 16 RPM |
| 输出槽位数 | 16 | 64 |
| 每周期处理物品数 | 1 | 8(可配) |
| 输出过滤 | 无 | 有(FilteringBehaviour,可接配方过滤) |
| 红石锁定 | 无 | 有(收到红石信号暂停加工,动力学不停) |
| 含水属性 | 支持(WATERLOGGED) | 支持 |
| 齿轮件/轴 | 小型齿轮件(ICogWheel),轴朝下 | 同左 |

5.2 处理速率

  • 每个 tick 的进度推进量:clamp(|转速| ÷ 16, 1, 512)(取绝对值,转动方向无关);
  • 一个周期耗时(tick)≈ 基础时长 × 时间倍率 ÷ 每 tick 推进量,向下减到 0 后结算(timer -= getProcessingSpeed());
  • 内置配方基础时长均为 500 tick = 25 秒。常见转速下的单周期耗时(难度 HIGH):

| 转速 | 每 tick 推进 | 500 tick 周期耗时 |
| :—: | :—: | :—: |
| 1 RPM(最低) | 1 | 500 tick ≈ 25.0 s |
| 16 RPM | 1 | 500 tick ≈ 25.0 s |
| 32 RPM | 2 | 250 tick ≈ 12.5 s |
| 64 RPM | 4 | 125 tick ≈ 6.3 s |
| 128 RPM | 8 | 63 tick ≈ 3.2 s |
| 256 RPM(Create 上限) | 16 | 32 tick ≈ 1.6 s |

  • 吞吐量差异:同转速下黄铜筛子每周期处理 8 个物品,即单位时间吞吐为普通筛子的 8 倍(例:16 RPM 下普通筛子 1 个/25 s,黄铜筛子 8 个/25 s,即每 3.125 s 一个)。

5.3 最低转速的运行时语义(重要)

方块实体的 minimumSpeed 字段按以下方式切换:

  • 空闲/未匹配配方时使用方块默认值:普通筛子 1 RPM、黄铜筛子 16 RPM(低于该值连配方搜索都不会进行);
  • 匹配到配方后切换为配方的 minimumSpeed 字段(JSON 未设置时默认 1)。因此黄铜筛子在 16 RPM 以上首次匹配后,可继续在低至 1 RPM 的转速下维持运转;
  • 配方级 hasSpeedRequirement() 的判定基准是普通筛子的配置默认值(1.0):仅当配方 minimumSpeed > 1 时才构成额外转速门槛。内置配方均未设置该字段,不产生额外门槛。

6. 筛选配方系统

6.1 配方 JSON 格式

配方类型 createsifter:sifting,放在数据包 data/<命名空间>/recipes/sifting/*.json(或任意路径,vanilla 规则)。字段:

| 字段 | 类型 | 默认 | 说明 |
| :— | :— | :—: | :— |
| type | 字符串 | 必填 | createsifter:sifting |
| ingredients | 数组 | 必填 | 配方原料。顺序无关:按物品类型自动分类——第一个「筛网类物品」为筛网,第一个「非筛网物品」为筛分物;其余条目在匹配时被忽略 |
| results | 数组 | 必填 | 产物。每条:{ "item": id, "chance": 0~1, "count": 数量(默认1) } |
| processingTime | 整数 | 0 | 基础处理时长(tick),运行时乘难度时间倍率 |
| waterlogged | 布尔 | false | 是否要求含水(见 6.2) |
| minimumSpeed | 浮点 | 1 | 配方级最低转速要求(见 5.3) |

示例(内置 sand_brass_mesh 的完整结构):

{
  "type": "createsifter:sifting",
  "ingredients": [
    { "item": "minecraft:sand" },
    { "item": "createsifter:brass_mesh" }
  ],
  "processingTime": 500,
  "results": [
    { "chance": 0.25, "count": 2, "item": "minecraft:redstone" },
    { "chance": 0.1, "item": "minecraft:glowstone_dust" },
    { "chance": 0.4, "item": "minecraft:bone_meal" },
    { "chance": 0.05, "item": "minecraft:blaze_powder" },
    { "chance": 0.2, "item": "create:experience_nugget" }
  ]
}
  • 筛网原料支持物品 ID 与标签(如 #createsifter:meshes);
  • 数据生成(SiftingRecipeBuilder)支持 whenModLoaded / whenModMissing 条件,产物含 conditions 字段,由 Fabric 资源条件机制在加载时判定;
  • 数据包配方在服务端 RecipeManager 重建(启动 / /reload)后按原版流程加载。

6.2 配方匹配规则

一条配方在机器/手持筛滤时按以下条件全部满足才匹配:

  1. 原料:输入槽(槽 0)匹配筛分物,筛网槽(槽 1)匹配筛网;
  2. 含水:配方.waterlogged == 筛子当前含水状态。注意内置配方只有泥土配方带 waterlogged: true,其余配方默认 false——即含水状态的筛子不会运行沙/沙砾/灵魂沙/玄武岩配方;
  3. 转速:配方有额外转速要求时(minimumSpeed > 1),|转速| ≥ 要求;
  4. 高级筛网互斥:若筛子内安装的是高级筛网,则筛网原料解析为首个堆叠为普通筛网(BaseMesh)的配方不会匹配;反之普通筛网也匹配不了高级筛网原料(原料判定本身已互斥,该规则对自定义配方/标签型筛网原料提供兜底)。决定条件是「筛子内安装的网」,与筛子种类无关——普通动力筛子装高级筛网同样只跑高级配方。

6.3 内置筛选配方全表(13 条)

全部基础时长 500 tick;概率为单次判定概率,同一配方可有多条独立判定(每次循环每个输入物品对每条产物独立掷骰)。

沙砾 Gravel

| 配方 ID | 筛网 | 产物与概率 |
| :— | :— | :— |
| gravel_andesite_mesh | 安山 | 铜粒 5% · 锌粒 1% · 铁粒 1% · 金粒 5% · 煤炭 10% · 燧石 10% |
| gravel_zinc_mesh | 锌 | 铜粒 5% · 锌粒 2% · 铁粒 5% · 金粒 10% · 煤炭 10% · 青金石 5% · 燧石 10% · 经验颗粒 10% |
| gravel_brass_mesh | 黄铜 | 粉碎铜矿石 10% · 粉碎锌矿石 10% · 粉碎金矿石 5% · 粉碎铁矿石 10% · 青金石 10% · 煤炭 15% · 燧石 10% · 经验颗粒 10% |
| gravel_advanced_brass_mesh | 高级黄铜 | 粉碎铜矿石 10% · 粉碎锌矿石 10% · 粉碎金矿石 5% · 粉碎铁矿石 15% · 青金石 10% · 钻石 5% · 绿宝石 2% · 经验颗粒 10% |

沙子 Sand

| 配方 ID | 筛网 | 产物与概率 |
| :— | :— | :— |
| sand_string_mesh | 线 | 红石粉 5% · 骨粉 40% |
| sand_andesite_mesh | 安山 | 红石粉 10% · 骨粉 40% · 经验颗粒 10% |
| sand_zinc_mesh | 锌 | 红石粉 15% · 骨粉 40% · 经验颗粒 10% |
| sand_brass_mesh | 黄铜 | 红石粉(×2)25% · 荧石粉 10% · 骨粉 40% · 烈焰粉 5% · 经验颗粒 20% |

灵魂沙 Soul Sand

| 配方 ID | 筛网 | 产物与概率 |
| :— | :— | :— |
| soul_sand_brass_mesh | 黄铜 | 下界石英 10% · 下界疣 5% · 经验颗粒 10% |
| soul_sand_advanced_brass_mesh | 高级黄铜 | 下界石英 45% + 15% 两条独立判定 · 下界疣 10% · 恶魂之泪 5% · 经验颗粒 20% |

泥土 Dirt(必须含水)

| 配方 ID | 筛网 | 产物与概率 |
| :— | :— | :— |
| dirt_string_mesh_waterlogged | 线 | 海带 20% · 海草 30% · 管珊瑚 5% · 脑纹珊瑚 5% · 气泡珊瑚 5% · 火珊瑚 5% · 鹿角珊瑚 5% |

粉碎玄武岩 Crushed Basalt(下界合金链,本分支移植自上游 1.21)

| 配方 ID | 筛网 | 产物与概率 |
| :— | :— | :— |
| crushed_basalt_sturdy | 耐固 | 远古残骸 2% · 下界合金碎片 1% · 经验颗粒 10% |
| crushed_basalt_advance_sturdy | 高级耐固 | 远古残骸 5% · 下界合金碎片 2% · 经验颗粒 10% |

前驱链路:玄武岩 →(create:crushing 粉碎轮,250 tick)/(create:milling 石磨,250 tick)→ createsifter:crushed_basalt。

6.4 内置配方 ID 清单

createsifter:sifting/ 前缀:

gravel_andesite_mesh          gravel_zinc_mesh            gravel_brass_mesh
gravel_advanced_brass_mesh    sand_string_mesh            sand_andesite_mesh
sand_zinc_mesh                sand_brass_mesh             soul_sand_brass_mesh
soul_sand_advanced_brass_mesh dirt_string_mesh_waterlogged
crushed_basalt_sturdy         crushed_basalt_advance_sturdy

其余 ID:机器合成 createsifter:sifter、createsifter:brass_sifter;筛网合成 createsifter:string_mesh、andesite_mesh、zinc_mesh、brass_mesh、sturdy_mesh、advanced_brass_mesh、advanced_sturdy_mesh;玄武岩处理 createsifter:crushing/basalt、createsifter:milling/crushed_basalt。

6.5 筛网与占位方块

  • 9 种筛网(均不可堆叠):string_mesh、andesite_mesh、zinc_mesh、brass_mesh、custom_mesh、advanced_brass_mesh、advanced_custom_mesh、sturdy_mesh、advanced_sturdy_mesh。其中 custom_mesh 与 advanced_custom_mesh 无内置配方,专供数据包使用;全部筛网已加入标签 #createsifter:meshes;
  • 占位方块:crushed_end_stone、dust 无内置配方,供整合包添加自定义筛选链路(方块类筛分物必须为方块——配置界面的新增配方仅接受方块类型,对应 lang 键 requires_block);
  • 高级筛网没有种类限制:普通筛子与黄铜筛子都可安装(区别于上游 Forge 版的黄铜筛子限定)。

6.6 期望产出速查(每消耗 1 个输入,难度 HIGH)

未按产物价值加权;count=2 已计入(0.25×2=0.5)。

| 配方 | 期望产物数/输入 | 黄铜筛子每周期(×8) |
| :— | :—: | :—: |
| 沙砾·安山 | 0.32 | — |
| 沙砾·锌 | 0.57 | — |
| 沙砾·黄铜 | 0.80 | 6.40 |
| 沙砾·高级黄铜 | 0.67 | 5.36 |
| 沙子·线 | 0.45 | — |
| 沙子·安山 | 0.60 | — |
| 沙子·锌 | 0.65 | — |
| 沙子·黄铜 | 1.25 | 10.00 |
| 灵魂沙·黄铜 | 0.25 | 2.00 |
| 灵魂沙·高级黄铜 | 0.95 | 7.60 |
| 泥土·线(含水) | 0.75 | — |
| 粉碎玄武岩·耐固 | 0.13 | — |
| 粉碎玄武岩·高级耐固 | 0.17 | — |


7. 运行时掉落判定与优先级

单次循环中,每个输入物品对配方的每条产物独立执行(SiftingRecipe.rollResults):

chance = min(1, 基础概率 × 难度产出倍率)
若命中:产出 count 个(默认 1)

优先级(从高到低):
1. recipeOverrides 覆盖(概率/数量直接采用覆盖值,不再乘倍率)
2. 难度产出倍率
3. 配方基础概率/数量
另:enableNetheriteSift=false 时,下界合金族产物在任何判定前被跳过
  • 掷骰使用静态共享的 RandomSource,仅允许在游戏线程调用(掉落、手筛均在服务端线程);
  • 溢出处理:产物放不进输出槽时不会销毁——黄铜筛子被输出过滤拒绝的产物与装不下的溢出物都会掉落在筛子上方;输出槽全部占满时机器进入空闲(不再推进计时),腾出空间后自动恢复;
  • 黄铜筛子的输出过滤(过滤槽)可接配方过滤(forRecipes),被过滤掉的产物同样掉落而非消失;
  • 手持筛滤(BaseMesh):长按 32 tick 完成一次,站在液体方块中视为含水;筛出物直接进背包(假玩家则掉落);代码路径调用 hurtAndBreak(1),但筛网注册时未设置耐久(maxDamage=0),实际永不损坏。

8. 权限与多人行为

权限判定(canCheat()):单机 / 局域网主机在世界允许作弊(或开 LAN 时勾选「允许作弊」)时获得;远程连接按权限等级 ≥ 2(OP)判定。

| 操作 | 权限要求 |
| :— | :— |
| 查看配置界面 | 无;远程服务器上整个界面只读(”Server config wins” / “Cannot edit on a remote server”) |
| 修改难度(ULTRA 除外) | 无作弊要求(受配方锁与远程只读限制;无作弊权限的玩家只能改难度) |
| 选择 ULTRA 难度 | 需作弊/OP |
| 逐配方覆盖(改概率/数量) | 需作弊/OP(经由配方编辑界面) |
| 编辑 / 新建 / 删除配方 | 需作弊/OP |
| 开启配方编辑锁 | 无(任意玩家可锁定) |
| 解除配方编辑锁 | 界面不可解(永久锁),仅手动改配置文件并重启 |

  • 配方编辑/覆盖写入服务端配置并实时注入服务端 RecipeManager,借原版同步机制下发:在线玩家(含手筛预测与 JEI 显示)立即看到一致的配方表,无需重进;
  • 数据包 /reload 期间有专门的基线保护(baselineDirty 标记):重载后重新采集「纯数据包基线」再合并注入,避免把旧编辑错误回滚或重复合并(详见 ModRecipeTypes 注释与事件顺序);
  • 配置界面支持会话级取消:打开界面时对全部可编辑项快照,Cancel 一次性还原(配方锁不在快照内——它必须永久生效)。

本文档基于 V1.1.0 源码(SifterConfig / BrassSifterConfig / Difficulty / SiftingRecipe / SifterBlockEntity / ModRecipeTypes / CustomRecipeStore 等)与运行时生成的配置文件核对整理;数值如与游戏内不符,以实际加载的配置文件与 jar 内资源为准。


许可与致谢

本版本为社区维护的非官方 Fabric 适配版。模组原版由 oierbravo 开发,Shulej 完成首次 Fabric 移植;本次适配在原有移植版基础上深度迭代,解决了 Create 6.0.8.1 版本的 API 兼容问题

  • 开源协议:LGPL-3.0
  • 原版作者:oierbravo(Forge 官方版本)
  • Fabric 初代移植:Shulej
  • 本次社区适配与功能新增:jiesoon771

注意:最上游 oierbravo 采用 LGPL-3.0(Forge 版);本适配版基于的 Fabric 源码仓库(Shulej)声称 MIT。为最充分对齐上游授权链,本适配版整体按 LGPL-3.0 发布。本适配版已保留全部上游声明。

本项目按”原样(AS-IS)”提供,不附带任何形式的担保。已验证基本功能可用,但仍可能存在缺陷。作者不保证未来会更新或长期维护;请自行承担使用风险。

感谢 oierbravo、Shulej 以及 Create 开发团队!


下载与源码

常见问题

Create Sifting Fabric – Updated 支持哪些 Minecraft 版本?

Create Sifting Fabric – Updated 支持 Minecraft Java 版 1.20.1,可用的加载器:Fabric。下载时注意选择和你游戏版本一致的文件。

Create Sifting Fabric – Updated 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Fabric,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。运行环境:客户端和服务端都要装。

评论

登录后评论和评分

jiesoon771 的其他作品

查看全部 →