[Forge] 1.21.1 | V8.0.0 RELEASE
Curse Maven Snippet
What's new
v8.0.0 Release | Oct 26, 2026
✨ New Features
More common events (
api.event.v2.common), fired the same on every loader:BlockEvents.PLACE: a block is about to be placed, by any block item (players, dispensers, other mods' machines) or an enderman; interrupt and it isn't, and the item isn't used up.PlayerEvents.PICKUP_ITEM(interrupt to leave the item on the ground),TRAVEL_TO_DIMENSION(before any move to another dimension: portals, commands, other mods' teleporters; interrupt to stay),CRAFTEDandSMELTED(an item taken from a crafting or furnace result slot).PlayerEvents.CLONE(a new player object copied from the old one, after death or leaving the End),RESPAWNandCHANGE_DIMENSION(after arriving), as on 26.1.2.LivingEvents.EQUIPMENT_CHANGE: what an entity wears or holds in a slot changed.RecipeEvents.CRAFT_RESULT: a crafting recipe's result for a crafting grid or a crafter; interrupt with another stack, or an empty one so nothing can be crafted.
Game tests from common code (
api.gametest), as on 26.1.2 and the same on Fabric, NeoForge and Forge:GameTests.register(modId, SomeTests.class)registers every@GameTestmethod (as<modid>:<class>/<method>), andGameTests.register(id, options, helper -> ...)one test by hand.GameTestOptionssets the structure, time limit, setup ticks, rotation, retries, sky access and batch (one per mod by default; there are no test environments on this version); without a structure of their own, tests run on CoolCatLib'scoolcatlib:gametest/platform, an empty 8 × 6 × 8 space on a stone floor. Positions count from the structure's corner, as on newer versions. Tests are added in a development environment or with-Dcoolcatlib.gametest=true(or the loader's own game test switch), then run with/test run <modid>.<class>.<method>,/test runall <modid>or on a game test server.Attachments on levels and on the server:
get,set,update,modify,hasandresettake aLevelor theMinecraftServer, saved with the level (the server's in the overworld's data folder) and synced (SyncPolicy.ALL) to the players in the level, or to everyone.getGlobal(level)reads the server's values on either side.Offline players' attachments:
getOffline,setOffline,updateOfflineandresetOfflineread and write a player's saved values whether or not they're online (an offline player's data file is written at once).Sound filters (
api.client.sound): muffle, roughen and echo the game's sounds, as heard through a wall, under a spell or in a cave.- A
SoundFilteris how loud a sound stays, how much of its high end it keeps, and how much of it goes through a distortion and into a reverb.muffled,quieter,distortedandechoingmake the usual ones;thencombines two andlerpgoes part of the way, for fades. SoundFilters.register(provider)adds aSoundFilterProvider, asked about each sound as it starts and as it moves, with aSoundContext: where it plays, which sound event it is, its category and whether it is relative to the listener (music, the menus; the menus' clicks are relative MASTER sounds here, as this version has no UI category).SoundFilterProvider.inWorldmakes one for the sounds in the world only, by their place.registergives back aRegistrationtoremove()it again.- Named filters for every sound at once (but the menus' clicks):
SoundFilters.set(id, filter, fadeTicks)fades one in,clear(id, fadeTicks)out again;isSet(id). From the server,SoundFilterControl.setandclear(api.sound) do the same for a player. SoundFilters.refresh()filters the sounds already playing again, when a provider's answers change.- Through OpenAL's EFX extension (a low-pass filter on each sound, sent to a distortion and a reverb effect); without it, sounds are left as they are.
- A
Items drawn in a GUI at an opacity (
api.client.gui.ItemOpacityRenderer), flat and solid ones alike, where the game draws them only fully opaque:renderandrenderWithDecorations(with the count and durability bar) at an opacity or anOpacityTween(in,out,between, eased over ticks and smooth at any frame rate), andwithOpacity(opacity, draw)for anything that draws items, fading the text and bars drawn with them too. Any item drawn while the shader color's alpha is under 1 fades with it, the game's own included.World effect layers:
frame.draw(material, VfxLayer.of(n))draws in a layer, lowest first, so a higher layer always covers a lower one. AVfxLayer.sorted(n)layer draws its painted-over shapes of every material back to front, so shapes of different textures cover each other as their distance says. Materials in a layer now draw in the order they were first used each frame, where before they drew in no set order.What is on the screen, for placing your own things out of the way (
api.client.gui.placement), as on 26.1.2:GuiAreas.hud()is the box of everything the HUD drew last frame (the game's and every mod's HUD layers),GuiAreas.screen()everything the open screen drew in its own pass (not its background or panel art, nor the tooltip) and its visible widgets, andGuiAreas.unrecorded(draw)draws without being recorded.GuiPlacement.hud(),screen()oramong(areas)finds the nearest clear spot for a box of a given size, sliding it in the directions allowed, within set bounds, past whatever is in the way.
🔧 Changes
- Config screens call configs by their own name ("Client", "Server"), after their mod's name where it matters ("Testing Mod › Client"), instead of a title made from the mod id ("Testingmod Client"): in a config's screen, its category popups, the config cards' tooltips and search results, and saved notices. Translate a config's name with
config.<modid>.<name>.label. - New version numbers:
<version>+<minecraft>, this one8.0.0+1.21.1, the same for every Minecraft version and loader. They follow on from 2100.4.0.0; the part before the+is what launchers and loaders compare, the Minecraft version after it is only a label. Depending on CoolCatLib: ask for>=8.0.0, and the Maven artifacts arecoolcatlib-<loader>:8.0.0+1.21.1.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects

