Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
19e1c76
feat: implement hurricane system with state synchronization and rende…
xGabou Apr 6, 2026
31ac29c
feat: add hurricane system with enhanced cloud management and renderi…
xGabou Apr 9, 2026
0887899
feat: introduce storm lifecycle phases and cyclone snapshot managemen…
xGabou Apr 10, 2026
45afbb5
feat: restore shared Simple Clouds rendering, re-anchor hurricanes, a…
xGabou Apr 23, 2026
3e91a87
feat: implement hurricane cloud rendering and diagnostics, enhance sh…
xGabou Apr 24, 2026
f757ccb
Dynamic forge 1.20.1 tornado (#96)
xGabou Apr 24, 2026
2cba498
chore: remove unused hurricane module imports from ForecastOrchestrator
xGabou Apr 24, 2026
3eb8bb7
chore: remove unused hurricane module imports from ForecastOrchestrator
xGabou Apr 24, 2026
2545e18
chore: clean up IDE workspace by ignoring workspace.xml and enhance h…
xGabou Apr 24, 2026
78ed2f0
feat: implement hurricane reservation caching and optimize rendering …
xGabou Apr 24, 2026
7a7a1f7
feat: enhance storm rendering with tornado and hurricane integration …
xGabou Apr 25, 2026
1ed7367
feat: improve hurricane and tornado rendering with enhanced depth han…
xGabou Apr 28, 2026
5a64f57
feat: add hurricane destruction mechanics with configurable options f…
xGabou Apr 28, 2026
3b463f7
feat: enhance tornado rendering with secondary depth sampling and ter…
xGabou Apr 28, 2026
42c08ce
feat: refactor BiomeChangeManager to use Pair for region tracking and…
xGabou Apr 29, 2026
8d979dc
Cull off-screen tornado volume passes
xGabou Apr 29, 2026
328e9fa
feat: implement hurricane lifecycle management with forming, active, …
xGabou Apr 30, 2026
9903e5d
feat: add tornado destruction configuration and optimize shader noise…
xGabou May 13, 2026
c08213f
feat: integrate launcher authentication with TLauncher detection and …
xGabou May 29, 2026
306ac52
feat: enhance tornado rendering with deferred scene depth rejection a…
xGabou May 31, 2026
d3f27a3
fix: change distant-horizons dependency from implementation to compil…
xGabou Jun 1, 2026
0f911b5
fix: enable depth writes for non-DH tornado composite to prevent terr…
xGabou Jun 1, 2026
1aac149
chore: add pa_realistic_cloud_renderer_design.md to .gitignore
xGabou Jun 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,4 @@
.tmp_dynamictrees/
.tmp_dynamictrees_full/

/pa_realistic_cloud_renderer_design.md
1,256 changes: 0 additions & 1,256 deletions .idea/workspace.xml

This file was deleted.

1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ This repository hosts **Project Atmosphere**, a Minecraft Forge 1.20.1 mod writt
- Keep braces on the same line as declarations (`if (...) {`).
- Ensure files end with a newline.
- When finished, do the summary inside CHANGES.md. if you added functionality, fixed bugs, or made other notable changes.
- For iterative rendering, compatibility, or crash investigations, log each attempted fix and result in a Markdown investigation log before trying another fix. Check that log first so failed approaches are not repeated.

## Build / Checks
- The project uses Gradle. The wrapper is not included, so use the system `gradle` command.
Expand Down
284 changes: 284 additions & 0 deletions CHANGES.md

Large diffs are not rendered by default.

514 changes: 514 additions & 0 deletions TORNADO_DH_DEPTH_INVESTIGATION.md

Large diffs are not rendered by default.

28 changes: 25 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,22 @@ mixin {


repositories {
maven { url = 'https://repo.spongepowered.org/repository/maven-public/' }
maven {
name = 'MinecraftForge'
url = 'https://maven.minecraftforge.net/'
content {
includeGroupByRegex('net\\.minecraftforge.*')
includeGroup('cpw.mods')
}
}
maven {
name = 'Sponge'
url = 'https://repo.spongepowered.org/repository/maven-public/'
content {
includeGroupByRegex('org\\.spongepowered.*')
}
}
mavenCentral()
maven { url "https://maven.blamejared.com/" }
maven {
url "https://www.cursemaven.com"
Expand Down Expand Up @@ -120,7 +135,8 @@ dependencies {
annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
//implementation fg.deobf("curse.maven:serene-seasons-plus-1288843:7027745")
implementation fg.deobf("nonamecrackers2:simpleclouds:0.7.3+1.20.1-forge")
//implementation fg.deobf("nonamecrackers2:simpleclouds:0.7.3+1.20.1-forge")
implementation fg.deobf("curse.maven:oculus-for-simpleclouds-1386686:7870940")
implementation fg.deobf("nonamecrackers2:crackerslib-forge:${crackerslib_version}")
implementation fg.deobf("nonamecrackers2:simplecloudsapi-forge:${api_version}")
compileOnly(fg.deobf("curse.maven:legendary-survival-overhaul-840254:6717844"))
Expand All @@ -140,6 +156,8 @@ dependencies {

compileOnly fg.deobf("curse.maven:project-atmosphere-for-tfc-1391548:7261639")
compileOnly fg.deobf("curse.maven:dynamictrees-252818:7502488")
compileOnly fg.deobf("curse.maven:simple-clouds-1121215:6928978")
compileOnly "maven.modrinth:protomanlys-weather:0.16.4-1.20.1-alpha"
//implementation "curse.maven:nolijium-969602:6264798"


Expand All @@ -152,6 +170,7 @@ dependencies {

runtimeOnly fg.deobf("curse.maven:chloride-931925:6615986")
runtimeOnly fg.deobf("curse.maven:embeddium-908741:5681725")
implementation fg.deobf("curse.maven:distant-horizons-508933:7948170")

// Local dependency, ensure the file exists in the libs directory
// Example mod dependency with JEI - using fg.deobf() ensures the dependency is remapped to your development mappings
Expand Down Expand Up @@ -190,6 +209,8 @@ tasks.named('processResources', ProcessResources).configure {
}

tasks.named('jar', Jar).configure {
archiveFileName.set("Forge-${mod_id}-pre-${project.version}.jar")

manifest {
attributes([
"Specification-Title" : mod_id,
Expand All @@ -201,6 +222,7 @@ tasks.named('jar', Jar).configure {
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
])
}

finalizedBy 'reobfJar'
}

Expand All @@ -215,7 +237,7 @@ tasks.withType(JavaCompile).configureEach {
]
}

def releaseJarFile = layout.buildDirectory.file("libs/${base.archivesName.get()}-${project.version}.jar")
def releaseJarFile = layout.buildDirectory.file("libs/Forge-${mod_id}-pre-${project.version}.jar")

tasks.register("discordWebhook") {
doLast {
Expand Down
213 changes: 213 additions & 0 deletions com/seibel/distanthorizons/api/DhApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package com.seibel.distanthorizons.api;

import com.seibel.distanthorizons.api.interfaces.events.IDhApiEventInjector;
import com.seibel.distanthorizons.api.interfaces.factories.IDhApiWrapperFactory;
import com.seibel.distanthorizons.api.interfaces.override.IDhApiOverrideable;
import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGeneratorOverrideRegister;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderObjectFactory;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderProxy;
import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent;
import com.seibel.distanthorizons.api.methods.override.DhApiWorldGeneratorOverrideRegister;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.api.interfaces.config.IDhApiConfig;
import com.seibel.distanthorizons.api.interfaces.world.IDhApiWorldProxy;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import com.seibel.distanthorizons.coreapi.DependencyInjection.OverrideInjector;
import com.seibel.distanthorizons.api.interfaces.data.IDhApiTerrainDataRepo;
import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IOverrideInjector;

/**
* This is the masthead of the API, almost everything you could want to do
* can be achieved from here. <br>
* For example: you can access singletons which handle the config or event binding. <br><br>
*
* <strong>Q:</strong> Why should I use this class instead of just getting the API singleton I need? <br>
* <strong>A:</strong> This way there is a lower chance of your code breaking if we change something on our end.
* For example, if we realized there is a much better way of handling dependency injection we would keep the
* interface the same so your code doesn't have to change. Whereas if you were directly referencing
* the concrete object we replaced, there would be issues.
*
* @author James Seibel
* @version 2023-12-16
* @since API 1.0.0
*/
public class DhApi
{
/**
* If you can see this Java Doc, this can be ignored. <br>
* This is just to let you know that Javadocs are available and that you should use the API jar
* instead of the full mod jar. <br><br>
*
* Note: Don't use this string in your code. It may change and is only for reference.
*/
public static final String READ_ME =
"If you don't see Javadocs something is wrong. \n" +
"If you are only using the full DH Mod in your build script, you won't have access to our javadocs and could potentially call into unsafe code. \n" +
"\n" +
"Please use the API jar in your build script as a compile time dependency " +
"and the full DH jar as a runtime dependency. \n" +
"\n" +
"Please refer to the example API project or the DH Developer Wiki for additional information " +
"and suggested setup. \n" + // DH Dev note: no links were included to prevent link rot.
"";
public static String readMe() { return READ_ME; }

/**
* This is just a humorous way to reference the {@link DhApi#READ_ME} constant string and hopefully peak a few people's attention
* vs the relatively boring "readMe".
*/
public static final String HEY_YOU_YOURE_FINALLY_AWAKE = READ_ME;
/**
* This is just a humorous way to reference the {@link DhApi#READ_ME} constant string and hopefully peak a few people's attention
* vs the relatively boring "readMe".
*/
public static String heyYou_YoureFinallyAwake() { return READ_ME; }



/**
* <strong>WARNING:</strong>
* All objects in this class will be null until after DH initializes for the first time. <br><br>
*
* Bind a custom {@link DhApiAfterDhInitEvent DhApiAfterDhInitEvent}
* to {@link DhApi#events ApiCoreInjectors.events} in order to be notified when this class can
* be safely used.
*
* @since API 1.0.0
*/
public static class Delayed
{
/**
* Used to interact with Distant Horizons' Configs.
* @since API 1.0.0
*/
public static IDhApiConfig configs = null;

/**
* Used to interact with Distant Horizons' terrain data.
* Designed to be used in conjunction with {@link DhApi.Delayed#worldProxy}.
* @since API 1.0.0
*/
public static IDhApiTerrainDataRepo terrainRepo = null;

/**
* Used to interact with Distant Horizons' currently loaded world.
* Designed to be used in conjunction with {@link DhApi.Delayed#terrainRepo}.
* @since API 1.0.0
*/
public static IDhApiWorldProxy worldProxy = null;

/**
* Used to interact with Distant Horizons' rendering system.
* @since API 1.0.0
*/
public static IDhApiRenderProxy renderProxy = null;

/**
* Used to create wrappers for Minecraft objects needed by other Distant Horizons API methods.
* @since API 2.0.0
*/
public static IDhApiWrapperFactory wrapperFactory = null;

/**
* Used to create custom renderable objects. <br>
* These objects can be added to the renderer in {@link IDhApiLevelWrapper}
* @since API 3.0.0
*/
public static IDhApiCustomRenderObjectFactory customRenderObjectFactory = null;
}



//==================//
// always available //
//==================//

// interfaces //

/**
* Used to bind/unbind Distant Horizons Api events.
* @since API 1.0.0
*/
public static final IDhApiEventInjector events = ApiEventInjector.INSTANCE;

/**
* Used to bind/unbind Distant Horizons Api events.
* @since API 1.0.0
*/
public static final IDhApiWorldGeneratorOverrideRegister worldGenOverrides = DhApiWorldGeneratorOverrideRegister.INSTANCE;

/**
* Used to bind overrides to change Distant Horizons' core behavior.
* @since API 1.0.0
*/
public static final IOverrideInjector<IDhApiOverrideable> overrides = OverrideInjector.INSTANCE;


// getters //

/**
* This version should only be updated when breaking changes are introduced to the Distant Horizons API.
* @since API 1.0.0
*/
public static int getApiMajorVersion() { return ModInfo.API_MAJOR_VERSION; }
/**
* This version should be updated whenever new methods are added to the Distant Horizons API.
* @since API 1.0.0
*/
public static int getApiMinorVersion() { return ModInfo.API_MINOR_VERSION; }
/**
* This version should be updated whenever non-breaking fixes are added to the Distant Horizons API.
* @since API 1.0.0
*/
public static int getApiPatchVersion() { return ModInfo.API_PATH_VERSION; }

/**
* Returns the mod's semantic version number in the format: Major.Minor.Patch
* with optional extensions "-a" for alpha, "-b" for beta, and -dev for unstable development builds. <br>
* Examples: "1.6.9-a", "1.7.0-a-dev", "2.1.0-b", "3.0.0", "3.1.4-dev"
* @since API 1.0.0
*/
public static String getModVersion() { return ModInfo.VERSION; }
/**
* Returns true if the mod is a development version, false if it is a release version.
* @since API 1.0.0
*/
public static boolean getIsDevVersion() { return ModInfo.IS_DEV_BUILD; }

/**
* Returns the network protocol version.
* @since API 1.0.0
*/
public static int getNetworkProtocolVersion() { return ModInfo.PROTOCOL_VERSION; }


// methods //

/**
* Returns true if the thread this method was called from is owned by Distant Horizons.
* @since API 2.0.0
*/
public static boolean isDhThread() { return Thread.currentThread().getName().startsWith(ModInfo.THREAD_NAME_PREFIX); }

}
Loading
Loading