1.3.0
Compatibility
Changes
Changelog All notable changes to AutoCraftSnowBlockMod.
Format based on Keep a Changelog; this project uses Semantic Versioning.
Every release targets Minecraft 1.21.11 with Fabric Loader 0.19.5 and Fabric API 0.141.6+1.21.11. The mod is client-side only ("environment": "client") — it is never required on a server and works on vanilla multiplayer.
1.3.0 — 2026-09-12 Rebuilt the interface from scratch in a flat, modern style instead of Minecraft's stone-and-bevel widgets.
Added Custom UI toolkit under client/ui, drawn entirely from filled rectangles — no textures, no resource-pack assets: Theme — flat dark palette. Surfaces step up in lightness as they come forward (scrim → card → row → hover), which is what creates depth without bevels. Indigo #6D7CF6 accent, green #34D399 for on-states, amber #F59E0B for lossy recipes. Draw — real rounded corners via scanlines (one fill for the straight middle band, one fill per corner row inset by the circle equation, so radius 8 costs 17 fills rather than hundreds), plus layered drop shadows, colour mixing and frame-rate-independent easing. ToggleSwitch — pill switch with a sliding knob and a track that fades between grey and green. FlatButton — primary, ghost and tab styles with hover fades. Filter tabs in the settings screen: All / Compress / Building / Lossy. Live subtitle showing how many recipes exist and how many are enabled. Coloured spine on each row marking enabled recipes and flagging lossy ones at a glance. Changed Settings screen redesigned: shadowed card on a flat scrim, header with the master switch, filter tabs, borderless search field with an accent focus ring, and rows carrying an item icon, clipped names, an inline threshold field and a switch. Vanilla list chrome removed — the dirt background, torn separators and chunky scrollbar are overridden away and replaced with a 3px thumb that only appears when the content overflows. Screen background is a flat scrim rather than the vanilla blur/panorama. Fixed Threshold text sat two pixels low inside its field. 1.2.0 — 2026-09-12 Expanded from two recipes to every 2×2 recipe in the game, with a scrollable list and an in-game HUD.
Added All 67 vanilla 2×2 single-ingredient recipes. The table was generated from data/minecraft/recipe/ in the 1.21.11 jar rather than written by hand, and splits into: 19 compressions (4 → 1): snowball, quartz, clay ball, brick, nether brick, glowstone dust, prismarine shard, amethyst shard, honeycomb, magma cream, pointed dripstone, resin brick, sand, red sand, popped chorus fruit, and several one-offs. 26 one-to-one conversions (4 → 4): stone → stone bricks, granite/diorite/andesite/tuff/ blackstone → polished, copper block → cut copper, end stone → end stone bricks, and similar. 22 lossy log → wood recipes (4 → 3). These destroy material, so they are marked, coloured amber, and never enabled by default. Multiple recipes enabled at once. Batches run one after another, since the 2×2 grid can only hold one material at a time. Per-recipe thresholds — necessary because stack sizes differ: 256 snowballs is sixteen stacks, but 256 quartz is only four. In-game HUD (top-left, toggleable) showing the mod is on, the relevant block's icon, and either Crafting Snow Block… 32 made or Snowball 143 / 256 for whichever enabled recipe is closest to firing. Uses Fabric's HudElementRegistry. Scrollable settings list with per-row toggle and threshold, plus a search box. Unknown items are skipped at load with a warning, so a future game version removing an item cannot stop the mod from starting. Changed Config format is now a map of per-recipe settings keyed by material id, replacing the single target + threshold pair. Unknown keys are pruned and missing ones seeded on load. CraftTarget enum replaced by the CraftRecipe record and the generated CraftRecipes table. Fixed Static-initialiser crash: the generated CraftRecipes.ALL = build() was declared before the TABLE it reads, which would have thrown NullPointerException on class load. Per-tick cost: recipe selection and the HUD each scanned 67 recipes × 36 slots every tick — roughly 48,000 slot reads per second. Both now use a single pass that tallies the whole inventory into a map. Config self-repairs null maps, unknown recipe keys and out-of-range thresholds. 1.1.0 — 2026-09-12 Added a settings screen and a second recipe, and fixed the bugs that made the mod silently stop working.
Added Settings screen with on/off, recipe choice and a threshold field. Opened with a new keybind (G, rebindable) and from Mod Menu — com.terraformersmc:modmenu:17.0.0, as modCompileOnly plus modLocalRuntime, so Mod Menu is never required at runtime. Block of Quartz as a second target alongside Snow Block. Config persists to config/autocraftsnowblockmod.json and can be saved from the GUI. Fixed Four defects, two of which stopped the mod permanently:
It turned itself off. A result-slot timeout ran enabled = false, so a single two-second hiccup — server lag, one dropped sync packet — disabled the mod until the player pressed N again. Failures now back off and retry, and the mod never disables itself. Opening chat stranded items in the crafting grid. ChatScreen is a Screen, and the guard did a full reset whenever mc.screen != null. Pressing T mid-cycle reset the state machine while the grid still held up to 64 snowballs; those items stopped counting toward the threshold, so the trigger never fired again and the only code that noticed an occupied grid was never reached. Dead until relog. The guard now separates a hard reset (world gone, chest open) from a soft pause (chat, pause menu, inventory — keep state and resume), and the idle state sweeps the crafting grid on every pass regardless of threshold. Stale result slot. Any snow block in slot 0 was accepted, including the previous craft's output that the server had not yet cleared, causing a phantom take and desync. A clean slate is now required before loading the grid. Backoff never applied — reset() zeroed the cooldown it had just set. Also added a watchdog (any state stuck beyond 200 ticks force-recovers), grid verification immediately after loading, and per-cycle totals so the "Crafted N" message stays accurate across interruptions.
Changed SnowBlockAutoCrafter renamed AutoCrafter, no longer snow-specific. fabric.mod.json set to "environment": "client". Removed the unused example mixins from the template; the mod needs none. 1.0.0 — 2026-09-11 First working version: auto-crafts snow blocks from snowballs without the inventory ever opening.
Added Client-side auto-crafting through the player's own 2×2 grid. InventoryMenu is always open server-side as container 0 — pressing E sends no packet at all, so the server cannot tell whether the inventory screen is being rendered. Driving it through MultiPlayerGameMode.handleInventoryMouseClick produces exactly the packets a mouse would, which is why this works on vanilla servers with nothing installed server-side. Threshold trigger (default 256) so everyday small amounts stay usable as snowballs. Toggle keybind (N, rebindable), off at every launch. JSON config for threshold and packet pacing. Tick-driven state machine: the client cannot compute crafting results itself (InventoryMenu.slotsChanged only recalculates the result slot when !level.isClientSide), so the work is spread across ticks to wait for the server to send the crafted block back. Grid loading picks the denser of two strategies — four whole stacks into the four slots, or a vanilla left-drag split when fewer than four stacks remain. Cleanup always returns leftovers to the inventory, since anything left in the 2×2 grid would be dropped on disconnect. Notes This is a client-side automation mod. It emits only vanilla-legal packets, but some servers with strict anti-cheat may flag rapid inventory clicks, and some server rules prohibit automation. The cooldownTicks setting exists to slow it down. Versions above are development milestones. Nothing was published to Modrinth or CurseForge, so no release carries a separate download.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:eoDdTh3G:moOsshEq"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:eoDdTh3G:moOsshEq"
}

