Releases: Onyx-i7/SimpleDifficulty
v0.8.1
Release v0.8.1 - Build System Modernization & RetroFuturaGradle Migration
This maintenance release focuses on modernizing the entire build infrastructure by migrating from the abandoned ForgeGradle 2.3 to RetroFuturaGradle 2.0.2, ensuring long-term compatibility with modern development environments and CI/CD pipelines
Technical Improvements & Build System Changes
-
Migrated to RetroFuturaGradle 2.0.2 (
build.gradle):- Completely replaced the abandoned ForgeGradle 2.3 build system with RetroFuturaGradle 2.0.2, actively maintained by the GTNewHorizons community
- Updated dependency resolution to use the GTNH Maven repository (
https://nexus.gtnewhorizons.com/repository/public/) for proper plugin resolution - Modernized Gradle syntax: replaced deprecated
archivesBaseNamewith the newbase { archivesName = '...' }block required by Gradle 9.x
-
Upgraded Gradle from 4.10.3 to 9.3.1 (
gradle-wrapper.properties):- Gradle 9.3.1 brings significant performance improvements including parallel execution, configuration caching, and enhanced error reporting
- Added the required
gradle-wrapper.jarto enable automated builds without manual Gradle installation. - Optimized JVM settings in
gradle.propertiesfor better memory management and garbage collection with modern Gradle
Performance Improvements
-
Build Speed:
- First build: Reduced from 10-15 minutes to 4-5 minutes (60-70% faster).
- Subsequent builds: Reduced from 5-10 minutes to 30-60 seconds (80-90% faster) thanks to intelligent caching.
- Minecraft decompilation: Fernflower now decompiles the entire Minecraft source in just 115 seconds (previously 5-10 minutes with ForgeGradle 2.3)
-
Development Experience:
- Incremental compilation: Only changed files are recompiled, not the entire project.
- Better IDE integration: Improved autocomplete, debugging, and error highlighting in modern IDEs (IntelliJ IDEA, VS Code)
- 525 MCP patches applied: All decompilation errors are automatically fixed, providing clean, readable method and variable names for debugging
Compatibility & Backward Compatibility
- Fully backward compatible: The compiled mod JAR works identically with Minecraft 1.12.2 Forge 14.23.5.2847 or later
- No source code changes: All Java source files remain completely unchanged. This is purely a build system migration
- Same dependencies: All mod dependencies (Streams, Serene Seasons, Dynamic Trees, Fluidlogged API, Traveler's Backpack) continue to work exactly as before
Known Issues
-
Deprecation Warnings:
- Issue: Gradle displays warnings about deprecated features that will be removed in Gradle 10.
- Status: These warnings come from RetroFuturaGradle 2.0.2 and do not affect the compiled mod. They will be resolved in future RFG updates no action required from users or developers
-
First Build Time:
- Issue: The first compilation after cloning the repository takes 4-5 minutes due to Minecraft decompilation and dependency downloads
- Status: This is expected behavior. All subsequent builds are cached and complete in under 1 minute. This is a one-time cost per development environment
For Developers & Contributors
If you want to build this mod locally or contribute to development:
Requirements:
- Java 21 or higher (for running Gradle)
- Java 8 (automatically downloaded by Gradle toolchain for mod compilation)
Build command:
./gradlew buildOutput files:
build/libs/SimpleDifficulty-1.12.2-0.8.1.jar - Main mod file (for players)
build/libs/SimpleDifficulty-1.12.2-0.8.1-api.jar - API for dependent mods
build/libs/SimpleDifficulty-1.12.2-0.8.1-dev.jar - Development sources for debugging
Note: The old ForgeGradle 2.3 setup is no longer supported. All developers must use the new RetroFuturaGradle 2.0.2 system or CleanroomMC MDK
Full Changelog: v0.8.0...v0.8.1
v0.8.0
Release v0.8.0 - Dynamic Weather2 Thermal Mechanics & Traveler's Backpack Integration
This major update introduces real-time environmental thermal influences on the player by linking into the Weather2 engine, alongside brand new liquid compatibility with Traveler's Backpack.
New Features & Compatibility
-
Dynamic Weather2 Thermal Influence (
Weather2Modifier.java):- Implemented a brand new dynamic temperature modifier by linking directly into
ITemperatureDynamicModifier. - SimpleDifficulty now actively communicates via reflection with Weather2's
WeatherObjectengine to scale your body temperature according to live storm severity. - Heat Waves / Sandstorms: Approaching or standing inside a Sandstorm now dramatically increases body heat.
- Blizzards / Freezing Fronts: Getting caught in a Blizzard drastically accelerates hypothermia.
- Wind Chill Factor Fallback: High gale winds (>0.8 speed) combined with active precipitation will now realistically plunge the player's perceived temperature.
- Implemented a brand new dynamic temperature modifier by linking directly into
-
Traveler's Backpack Fluid Integration:
- Added full compatibility with the Traveler's Backpack mod tanks.
- Players can now successfully pour, store, and transport Purified Water and Salt Water directly inside the backpack's built-in fluid tanks.
Known Issues
- Traveler's Backpack Creative Tab Delay:
- Issue: There is currently a small, brief lag spike/delay when opening the Traveler's Backpack creative tab in-game.
- Status: This is a known issue due to registry caching for the new fluid types on tab initialization. It only affects the creative menu loading time slightly and does not impact regular gameplay, survival backpack usage, or tank mechanics. A patch will be worked on for the next update.
Code Cleanup & Technical Changes
- Robust Multi-Mod Fallbacks: Patched the reflection bridge to suppress runtime discrepancies securely. If Weather2 is uninstalled or undergoes updates, the mod fails gracefully back to stable Vanilla behavior without throwing exceptions or causing server crashes.
- Campfire debug enabled by default: This generated unnecessary logs and it was because I forgot to remove it and it was used to see what was failing. This was there because it had many errors with Weather2 compatibility.
Full Changelog: v0.7.9...v0.8.0
v0.7.9
Release v0.7.9 - Bugfixes & Weather2 Compatibility
This is a minor update that fixes issues related to weather synchronization and introduces a patch for campfire behavior when running alongside Weather2, as well as an improvement in Weather2 compatibility for future updates
Bugfixes
-
Fixed Weather2 Compatibility with Rain Collectors:
Resolved an issue where rain collectors failed to detect rain properly when Weather2 was installed
Note: The collection rates are currently accelerated, I will see if I can adjust the filling speed to a slower one in the next update -
Fixed Premature Campfire Extinguishing:
Issue: Campfires were extinguishing almost instantly after being lit due to an unverified external method call
Fix: I improved the logic of the extinguishCampfire method. The server now performs a check of the weather conditions (isRainingAt) before allowing the fire block to change state, blocking extinction loops caused by updates from neighboring blocks or external event handlers
Improvements
- Improvement & Optimization of
Weather2Compat.java:
This is not yet 100% implemented, but these code improvements will be useful for future updates, and soon it will be possible to add features like the wind making you feel cold or hot. Depending on this, it will likely be added in versions 0.8.0 or 0.9.0, as the code is somewhat simple since it only detects whether it is raining or not
v0.7.8
Release v0.7.8 - Memory Leak Purge & Performance
Main Features
-
Massive Garbage Collector Leak Purge
Critical performance bottlenecks on both client and server threads have been thoroughly eliminated. Iterative loops that handle real-time rendering, translation keys, and thirst/temperature attributes have been structurally detached from volatile array cloning allocations, resulting in a dramatic reduction in CPU overhead and fluid frame pacing. -
Functional Lambda Translation for Item Properties
Legacy, verbose anonymous inner classes used by Forge’s item property override registries have been completely modernized into efficient functional lambda streams. This prevents the runtime heap from being bloated by micro-instantiations during inventory ticks and visual item updates. -
Deep Code Archeology & Legacy Removal
Continuing the structural cleanup started in v0.7.7, ancient "fossilized" code remnants dating back 7 years to version v0.1.0 and obsolete layers from 4 years ago have been entirely eradicated. The codebase is now a lean, optimized, and fully modernized environment tailored for high-performance 1.12.2 technical modpacks. -
Robust NBT & Boundary Fail-Safes
Enhanced protection layers have been injected into item metadata and compound NBT handlers. The mod now gracefully handles corrupt itemstacks, extreme edge-case sub-types, or unexpected sub-zero metadata indexing without throwing null pointer exceptions or crashing server tickers.
Technical changes & Refactoring of sources
-
ItemCanteen.java&ItemDragonCanteen.java:- Resolved a severe client-side GC leak inside
getTranslationKeyby caching the immutableThirstEnum.values()array into a local static reference (THIRST_VALUES), saving megabytes of redundant heap allocations per minute. - Re-engineered the "contain"
ResourceLocationproperty getter override using an optimized lambda expression. - Secured type safety and cleared raw type compilation warnings by adding explicit diamond types (
<ItemStack>) to theActionResultinstantiations.
- Resolved a severe client-side GC leak inside
-
ItemIronCanteen.java:- Modernized property overrides using functional lambda structures to compress bytecode and speed up rendering calls.
- Fixed a potential heap leak by replacing repetitive enum evaluation loops with cached static value lookups.
-
ItemDrinkBase.java:- Fixed an optimization flaw inside
onItemUseFinishwhere calling.getRegistryName().toString()repeatedly forced redundant string objects into memory; now safely assigned and evaluated via a local variable wrapper. - Optimized JSON configuration lookups by changing the
jctListloop to utilize an explicit null/empty pre-check gate, completely skipping iterator allocations when no custom consumable thirst overrides are present.
- Fixed an optimization flaw inside
-
ItemJuice.java:- Solved a critical real-time performance bottleneck by caching
JuiceEnum.values()locally toJUICE_VALUES, cutting off constant array cloning across rendering, thirst level updates, and dirty saturation checks. - Hardened the
getEnumForStacksubroutine against out-of-bounds corruption by introducing a strict lower-bound array index validation gate (meta < 0).
- Solved a critical real-time performance bottleneck by caching
-
ItemThermometer.java:- Replaced a highly inefficient map auditing system that previously generated massive autoboxing overhead during real-time client texture wobbling (
wobble). - Implemented an advanced high-performance map clearing sequence using Java 8 lambda
removeIfstreams directly on theentrySet(), dropping the redundant tracking list entirely. - Purged old, experimental, and dead commented code sections to restore source sanitization under strict developer guidelines.
- Replaced a highly inefficient map auditing system that previously generated massive autoboxing overhead during real-time client texture wobbling (
Download Guide
- Correct file:
SimpleDifficulty-1.12.2-0.7.8.jar - Developer files: Avoid files ending in
-api.jaror-sources.jar.
v0.7.7
Release v0.7.7 - Performance Improvement & Code Modernization (Part I)
In this version, almost all the source code has been modernized and optimized; at this moment, the mod may be prone to errors since 90% or 100% of it has been rewritten.
The changes in this version are so significant that it's impossible to mention them all, as most of the code has been rewritten, updating code that was 7 years old. That said, I do notice a performance improvement on my PC, not a very noticeable one, but it is an improvement in performance.
Known bugs in this version:
- The campfire goes out extremely quickly, almost instantly.
- The Rain Collector doesn't work at all.
Review the version comparison as it is very long and I did it in 3 days, and I forgot to briefly note the changes. I'm sorry :(
Full changelog: v0.7.6...v0.7.7
v0.7.6
Release v0.7.6 - Weather2 Integration, Ice Retextures & Source Refactoring
Main Features
-
Comprehensive Weather2 Remastered Integration Framework
Survival mode now dynamically adapts to storm and moving cells instead of relying on dimensionally uniform and native global variables. The block logic throughout the mod has been structurally modified to intercept changing atmospheric vectors, shifting clouds -
Dynamic Rain Collector Reset
The Rain Collector block is no longer subject to restrictive metrics from vanilla suppliers who previously halted operations based on coded regional biome parameters or elevation limits. It now connects seamlessly with active grid arrays, allowing containers to accurately retain precipitation during specialized localized rainfall under any global environment -
Reactive environmental fire extinguishing
Active bonfires now immediately detect stormfronts passing through the server thread. When exposed to localized rain cells, illuminated structures automatically shut down, instantly generating immersive bursts of directional smoke particles ('SMOKE_LARGE' and 'SMOKE_NORMAL') to visually reflect sudden outdoor environmental changes -
Mechanics of hypothermia due to hailstorms
Weather events have a direct impact on survival attributes. Being hit by physical blocks of entities generated during hailstorms now triggers damage source matching, applying instantaneous and localized drops in body temperature using a dedicated time category to simulate rapid environmental freezing -
Saltwater Ice and Purified Ice Review
To solve logic problems, the Saltwater Ice and Purified Ice blocks have received an updated texture since the new minecraft textures of the ice block were used in the past, but 1.12.2 has the old textures and has been modified a bit by me (although I'm probably going to leave it as it was)
Technical changes & Refactoring of sources
-
BlockCampfire.java:- Replaced vanilla checks 'world.isRainingAt(pos.up())' with custom queries 'Weather2Compat.isRainingAt(world, checkPos)'.
- Fixed vanilla rain extinguishing failures using scheduled updates optimized for the client side
- Injected direct weather validation backups inside the native 'neighborChanged' and 'randomTick' loops to resolve rendering conflicts with third-party weather managers (e.g. Weather2)
- Added a public and thread-safe method called 'extinguishCampfire(World, BlockPos, IBlockState)' to handle immediate state changes from external simulation tickers
-
BlockRainCollector.java:- I have completely removed the original conditional statement block 'world.getBiomeProvider().getTemperatureAtHeight(f, pos.getY()) >= 0.15F' completely inside 'tryFillFromWeather'
- Removed the configuration-based random scalar constraint ('ModConfig.server.miscellaneous.rainCollectorFillChance') within the dedicated subroutine for weather fill
- Re-engineered 'tryFillFromWeather(World, BlockPos, IBlockState)' to directly increase the 'LEVEL' integer block state based solely on active detection of the 'Weather2Compat' grid
- Fixed an issue where container filling mechanics would inadvertently crash when players interacted with the collector in Creative Mode
-
MiscHandler.java:- Added a dedicated listener targeting 'TickEvent.WorldTickEvent' limited exclusively to 'TickEvent.Phase.END' to protect the thread evaluation order
- Created an optimization gate using 'world.getTotalWorldTime() %20 != 0' to limit loop execution intervals to exactly 1 second (20 game ticks)
- Implemented a spatial scan of physical coordinates targeting an area defined by 'BlockPos.getAllInBoxMutable' within a structural radius of 16x4x16 around active player arrays to force a continuous state Sync
-
TemperatureHandler.java:- Added an isolated subscription hook 'onPlayerHurtByWeather(LivingHurtEvent)'
- Configured string matching parameters by checking 'if("hail".equals(event.getSource().getDamageType()))' to process specific damage types originating from external impacts on weather entities
- Managed core capacity modifications by passing the runtime converter string
TemporaryModifierGroupEnum.DRINK.group()instead of structural raw instances
-
CompatController.java&ModifierWet.java:- Refactored
setupCommonPostInit()to leverage an explicit reflective wrapper usingClass.forName("com.charles445.simpledifficulty.compat.mod.Weather2Compat")to safely bypass hard references on headless servers - Intercepted standard environmental temperature offsets by routing fluid check mechanics through the dynamic
Weather2Compatlocalization layer
- Refactored
-
Asset Refactoring & Legacy Preservation:
- Retained the previous modern textures in the source and final build outputs under the altered filenames
saltwater_ice_old.pngandpurifiedwater_ice_old.pngfor asset archiving
- Retained the previous modern textures in the source and final build outputs under the altered filenames
-
Performance & Build Architecture Corrections:
- Optimized block updates across both functional containers by enforcing state flag 3, ensuring instant dynamic lighting updates and comparator redstone signal recalculations
- Cleared compiler conflicts by dropping the redundant, duplicate
TemperatureHandler.javafile structure inside theapi/temperature/directory tree
Download Guide
- Correct file:
SimpleDifficulty-1.12.2-0.7.6.jar - Developer files: Avoid files ending in
-api.jaror-sources.jar.
v0.7.6-alpha2
v0.7.6-alpha2
Important note: This is an alpha version designed for early testing and archiving of features. Not recommended for major or long-term worlds, as features may change or be removed, which could break the world's saves. Also, since my development is split between a public and a private repository, code merge errors or erroneous logic can occur.
Fixes & Optimizations
- fix(campfire): Modernized and optimized core logic in BlockCampfire.java, fixing vanilla rain extinction behavior and adding smoke particle effects when extinguished.
- style(textures): Replaced modern Minecraft ice textures for purified and salt water with a customized classic style.
- refactor(assets): Retained the previous modern textures in the source and final .jar file under the names saltwater_ice_old.png and purifiedwater_ice_old.png.
Screenshots
Side-by-side texture comparison (First time using GIMP):

v0.7.6-alpha1
v0.7.6-alpha1
Important note: This is an alpha version designed for early testing and archiving of features. Not recommended for major or long-term worlds, as features may change or be removed, which could break the world's saves. Also, since my development is split between a public and a private repository, code merge errors or erroneous logic can occur.
Fixes & Optimizations
- fix(campfire): Fixed block not extinguishing under vanilla rain by utilizing client-side scheduled updates.
- fix(campfire): Resolved rendering conflicts with third-party weather managers (e.g., Weather2).
- fix(rain-collector): Fixed item filling mechanics being blocked when players are in Creative Mode.
- perf(blocks): Optimized both blocks by switching world block state updates to flag 3, ensuring instant lighting and comparator updates.
v0.7.5
Release v0.7.5 - World Gen, Recipes & Weather Fixes
This update brings crucial bug fixes, deep performance optimizations, and expanded compatibility to ensure a smoother survival experience.
Crafting & Recipes
- Purified Water Bottle Recipe Fix:
- Corrected outdated Ore Dictionary syntax (
#CHARCOAL_FILTER→forge:ore_dict) for proper Forge 1.12.2 compatibility. - Added strict NBT data checks to the input water bottle. This fixes the "Uncraftable Potion" visual artifact in JEI and prevents players from accidentally converting valuable potions into purified water.
- Corrected outdated Ore Dictionary syntax (
World Generation
- Ice Generation Refactor:
- Resolved a bug where Purified Water Ice would incorrectly overwrite Salt Water Ice during world generation loops.
- Optimized chunk coordinate calculations using bitshift operations for faster math.
- Added safety gates to skip invalid precipitation heights (e.g., deep oceans), preventing unnecessary processing ticks.
- Applied proper block update flags (
flag = 2) during generation to bypass redundant light updates and neighbor notifications, speeding up world loading.
Mod Compatibility
- Weather2 Remastered Support:
- Rain Collectors now correctly detect and fill during localized rain events generated by Weather2.
- Implemented a highly optimized, static-cached reflection system to scan for Weather2's API. This ensures zero performance impact, zero memory leaks, and a graceful fallback to vanilla behavior if the mod is absent.
Localization & System
- Translations: Added French support via machine translation, updated Spanish (Mexico) with official regional terms, and tweaked Spanish (Spain).
- ModUpdateChecker: Updated tracking endpoints to properly align with the juraj-hrivnak versioning index.
Download Guide
- Correct file:
SimpleDifficulty-1.12.2-0.7.5.jar - Developer files: Avoid files ending in
-api.jaror-sources.jar.
v0.7.4
Release v0.7.4 - Localization & JEI Fixes
This minor update resolves item translation display issues, enhances developer documentation, and fixes recipe detection for Just Enough Items (JEI)
Added
- Missing Translations: Added the missing salt water bucket translation entry to
ru_ru.lang.
Fixed & Improved
- Bucket Localization: Added missing bucket localization entries across
en_us.langand all other supported language files to fix incorrect translation displays in-game. - JEI Recipe Detection: Modified
FixedBrewingOreRecipe.javato properly handle NBT data, ensuring JEI accurately detects and displays custom potion recipes. - Code Documentation: Updated
FluidBasic.javawith detailed comments explaining how bucket localization strings are handled via.langfiles.
Download Guide
If you are a player, please download the standard file. Avoid files ending in -api.jar or -sources.jar, as those are exclusively for developers.
- Correct file:
SimpleDifficulty-1.12.2-0.7.4.jar - Developer files:
SimpleDifficulty-1.12.2-0.7.4-api.jar/SimpleDifficulty-1.12.2-0.7.4-sources.jar