Compare commits
147 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 71ca26bba9 | |||
| 75a51be28c | |||
| a66e4ba157 | |||
| f2b9e428d3 | |||
| 5b2497b9d4 | |||
| e78424def4 | |||
| e2c94de6e6 | |||
| daa3caf684 | |||
| 5991aa42d9 | |||
| ff6a5aae69 | |||
| 80d9b4540b | |||
| 4998991ebe | |||
| 14343569fe | |||
| be6cc5ff4e | |||
| 0ad3391bea | |||
| 582d998e2e | |||
| c00ee26075 | |||
| 4c9f70a52f | |||
| 29481bc123 | |||
| e274c9e004 | |||
| 73988f0308 | |||
| c4a9e7a2a7 | |||
| af6dca6e5e | |||
| a49720a221 | |||
| 12a66e70c9 | |||
| 00d8aa356b | |||
| d40d94a565 | |||
| c1f798793e | |||
| 8fe4ad454c | |||
| 17022f2df2 | |||
| 7fa4bc35f6 | |||
| 85df9c5ef4 | |||
| 45d4f390a9 | |||
| e7b60b7562 | |||
| 2615177907 | |||
| a83d7e2a26 | |||
| 8a2182e238 | |||
| d45455092c | |||
| da18469fd4 | |||
| 6b5bae9bee | |||
| e29a7786e4 | |||
| 55a837ca5e | |||
| 94cba6cf67 | |||
| 294685df00 | |||
| 2642b7a9a4 | |||
| 45594e4e47 | |||
| 54cd1a2e48 | |||
| a20fb982ec | |||
| 184d61e637 | |||
| 06ea56767f | |||
| 1f6e137759 | |||
| c7cf7885ae | |||
| 8e98444887 | |||
| 9bfe2e8233 | |||
| 21f4adc769 | |||
| 3b10ca5809 | |||
| 6cc8284747 | |||
| 6254f7156f | |||
| 0fa03701a4 | |||
| 49125cae47 | |||
| 3298857d0c | |||
| d939cbeb96 | |||
| 54d254be73 | |||
| d433fdea62 | |||
| ffa1c54ff3 | |||
| 019ac6dec3 | |||
| 08d3da47f4 | |||
| 348ac2b734 | |||
| fe014b4985 | |||
| b7f6f3b900 | |||
| 3c76ed71d8 | |||
| 5de1998913 | |||
| 05c0f030cb | |||
| bd85329589 | |||
| da0f4ae326 | |||
| b37e568372 | |||
| b1c6a5c1d4 | |||
| 8222126e8f | |||
| b5b888c69f | |||
| 85f6b8320b | |||
| 6c4740e8aa | |||
| ffda83c25d | |||
| 18859d22a8 | |||
| befa3b375e | |||
| a96c08cad4 | |||
| d7f789c402 | |||
| ed28bcd0ba | |||
| 982ae0c0a0 | |||
| d17897f276 | |||
| c0ccef7e82 | |||
| 55e5c64c68 | |||
| da72f783ed | |||
| 8a9bfa3d33 | |||
| 82937d840a | |||
| c1bd358502 | |||
| a8a22fd9fe | |||
| adb70857fe | |||
| a680596b3e | |||
| b2986ec782 | |||
| f40f7afab3 | |||
| 59555d1ca8 | |||
| 6e2eb7d1ac | |||
| 69483067b4 | |||
| c815591565 | |||
| f82b7ec608 | |||
| 23a107682c | |||
| 26da69c875 | |||
| 8f2df2396d | |||
| dbc9cbb418 | |||
| 09c788e495 | |||
| 9af71ac0ea | |||
| 2db20f8f24 | |||
| 2c9827c227 | |||
| 825b1ab4db | |||
| c61faac06c | |||
| 6b442f03c1 | |||
| 10ab638643 | |||
| d349d0c453 | |||
| e5c948ce9c | |||
| c51255f379 | |||
| 5bbeceee56 | |||
| ee78920a88 | |||
| 138972cf18 | |||
| 1bda767cd7 | |||
| cf1402edb9 | |||
| 778144a553 | |||
| fcca51a8d9 | |||
| 3cc663ee95 | |||
| 52f15a86fd | |||
| 734bb4afb8 | |||
| 9cd48fb5d7 | |||
| cd5c3d9f13 | |||
| 73ba1c8b56 | |||
| 8199b4408a | |||
| c00e3d7393 | |||
| 5d60251da0 | |||
| 855d707b3e | |||
| 592a1c3601 | |||
| da280db0f8 | |||
| 0ee6673e68 | |||
| 8bedb3dbaa | |||
| ea0e24b430 | |||
| cd35461df6 | |||
| 40580e81c2 | |||
| 1a279b90be | |||
| e34203fe3d | |||
| 870c0f68d3 |
+4
-1
@@ -34,6 +34,9 @@ build.properties
|
|||||||
|
|
||||||
# Sqlite databases
|
# Sqlite databases
|
||||||
*.sqlite
|
*.sqlite
|
||||||
|
*.sqlite-journal
|
||||||
|
*.sqlite-shm
|
||||||
|
*.sqlite-wal
|
||||||
|
|
||||||
# Don't add access transformers to git as it's dynamically generated
|
# Don't add access transformers to git as they're dynamically generated
|
||||||
accesstransformer.cfg
|
accesstransformer.cfg
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
# use Eclipse's JDK
|
# use Eclipse's JDK
|
||||||
# The ci should always use a unix(-like) OS to work
|
# The ci should always use a unix(-like) OS to work
|
||||||
image: eclipse-temurin:17
|
image: eclipse-temurin:21
|
||||||
|
|
||||||
# all stages need to be defined here
|
# all stages need to be defined here
|
||||||
# TODO: Make stages depend on what is in versionProperties
|
# TODO: Make stages depend on what is in versionProperties
|
||||||
@@ -30,7 +30,7 @@ build:
|
|||||||
stage: build
|
stage: build
|
||||||
parallel:
|
parallel:
|
||||||
matrix:
|
matrix:
|
||||||
- MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1", "1.20.2", "1.20.4"]
|
- MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1", "1.20.2", "1.20.4", "1.20.6"]
|
||||||
script:
|
script:
|
||||||
# this both runs the unit tests and assembles the code
|
# this both runs the unit tests and assembles the code
|
||||||
- ./gradlew clean -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
|
- ./gradlew clean -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
|
||||||
|
|||||||
@@ -1,18 +1,16 @@
|
|||||||
# <img src="https://gitlab.com/jeseibel/distant-horizons-core/-/raw/main/_Misc%20Files/logo%20files/LOD%20logo%20flat%20-%20with%20boarder.png" width="32"> Distant Horizons
|
# <img src="https://gitlab.com/jeseibel/distant-horizons-core/-/raw/main/_Misc%20Files/logo%20files/LOD%20logo%20flat%20-%20with%20boarder.png" width="32"> Distant Horizons
|
||||||
|
_See farther without turning your game into a slide show._
|
||||||
|
|
||||||
> A mod that adds a Level of Detail System to Minecraft
|
<br>
|
||||||
|
|
||||||
|
|
||||||
# What is Distant Horizons?
|
# What is Distant Horizons?
|
||||||
|
|
||||||
Distant Horizons is a Minecraft mod that adds a Level Of Detail (LOD) system to\
|
Distant Horizons is a mod which implements a [Level of Detail](https://en.wikipedia.org/wiki/Level_of_detail_(computer_graphics)) system to Minecraft.\
|
||||||
render simplified chunks outside the normal render distance\
|
This allows for far greater render distances without harming performance by gradually lowering the quality of distant terrain.
|
||||||
allowing for an increased view distance without harming performance.
|
|
||||||
|
|
||||||
In other words: this mod lets you see farther without turning your game into a slide show.\
|
Below is a video demonstrating the system:
|
||||||
If you want to see a quick demo, check out a video covering the mod here:
|
|
||||||
|
|
||||||
<a href="https://youtu.be/_04BZ8W2bDM" target="_blank"></a>
|
<a href="https://youtu.be/SxQdbtjGEsc" target="_blank"></a>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@@ -81,7 +79,8 @@ Modmenu: 1.16.22
|
|||||||
- 1.18.1, 1.18
|
- 1.18.1, 1.18
|
||||||
- 1.19.1, 1.19
|
- 1.19.1, 1.19
|
||||||
- 1.19.3
|
- 1.19.3
|
||||||
<br><br>
|
|
||||||
|
<br>
|
||||||
|
|
||||||
### Plugin and Library versions
|
### Plugin and Library versions
|
||||||
|
|
||||||
@@ -101,7 +100,7 @@ Java Preprocessor plugin: Manifold Preprocessor
|
|||||||
Visit https://www.oracle.com/java/technologies/downloads/ for installers.
|
Visit https://www.oracle.com/java/technologies/downloads/ for installers.
|
||||||
* Git or someway to clone git projects. <br>
|
* Git or someway to clone git projects. <br>
|
||||||
Visit https://git-scm.com/ for installers.
|
Visit https://git-scm.com/ for installers.
|
||||||
* (Not required) Any Java IDE with plugins that support Manifold, for example Intellij IDEA.
|
* (Not required) Any Java IDE with plugins that support Manifold, for example IntelliJ IDEA.
|
||||||
|
|
||||||
**If using IntelliJ:**
|
**If using IntelliJ:**
|
||||||
1. Install the Manifold plugin
|
1. Install the Manifold plugin
|
||||||
@@ -114,17 +113,14 @@ Java Preprocessor plugin: Manifold Preprocessor
|
|||||||
3. Make sure eclipse has the JDK 17 installed. (This is needed so that eclipse can run minecraft)
|
3. Make sure eclipse has the JDK 17 installed. (This is needed so that eclipse can run minecraft)
|
||||||
4. Import the project into eclipse
|
4. Import the project into eclipse
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
## Switching Versions
|
## Switching Versions
|
||||||
|
|
||||||
To switch between different Minecraft versions, change `mcVer=1.?` in the `gradle.properties` file.
|
To switch between different Minecraft versions, change `mcVer=1.?` in the `gradle.properties` file.
|
||||||
|
|
||||||
If running in an IDE, to ensure the IDE noticed the version change, run any gradle command to refresh gradle. (In IntellJ you will also need to do a gradle sync if it didn't happen automatically.)
|
If running in an IDE, to ensure the IDE noticed the version change, run any gradle command to refresh gradle.\
|
||||||
>Note: There may be a `java.nio.file.FileSystemException` thrown when running the command after switching versions. To fix it, either restart your IDE (as your IDE is probably locking a file) or use a tool like LockHunter to unlock the linked file(s). (Generally it is a lib file under `common\build\lib`, `forge\build\lib`, or `fabric\build\lib`). \
|
In IntelliJ, you will also need to do a gradle sync if it didn't happen automatically.
|
||||||
> If anyone knows how to solve this issue please let us know here: \
|
|
||||||
> https://gitlab.com/jeseibel/distant-horizons/-/issues/233
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@@ -138,21 +134,20 @@ From the File Explorer:
|
|||||||
2. Download the core from https://gitlab.com/jeseibel/distant-horizons-core and extract into a folder called `coreSubProjects`
|
2. Download the core from https://gitlab.com/jeseibel/distant-horizons-core and extract into a folder called `coreSubProjects`
|
||||||
3. Open a terminal emulator in the project folder (On Windows you can type `cmd` in the title bar)
|
3. Open a terminal emulator in the project folder (On Windows you can type `cmd` in the title bar)
|
||||||
4. Run the commands: `./gradlew assemble` (You may need to use a `.\` on Windows)
|
4. Run the commands: `./gradlew assemble` (You may need to use a `.\` on Windows)
|
||||||
5. Merge the jars wih `./gradlew mergeJars`
|
5. Merge the jars with `./gradlew mergeJars`
|
||||||
6. The compiled jar file will be in the folder `Merged`
|
6. The compiled jar file will be in the folder `Merged`
|
||||||
|
|
||||||
From the command line:
|
From the command line:
|
||||||
1. `git clone --recurse-submodules https://gitlab.com/jeseibel/distant-horizons.git`
|
1. `git clone --recurse-submodules https://gitlab.com/jeseibel/distant-horizons.git`
|
||||||
2. `cd minecraft-lod-mod`
|
2. `cd distant-horizons`
|
||||||
3. `./gradlew assemble`
|
3. `./gradlew assemble`
|
||||||
4. `./gradlew mergeJars`
|
4. `./gradlew mergeJars`
|
||||||
5. The compiled jar file will be in the folder `Merged`
|
5. The compiled jar file will be in the folder `Merged`
|
||||||
|
|
||||||
Run tests with: `./gradlew test`
|
Run tests with: `./gradlew test`
|
||||||
|
|
||||||
>Note: You can add the arg: `-PmcVer=?` to tell gradle to build a selected MC version instead of having to modify the `gradle.properties` file. \
|
>Note: You can add the argument `-PmcVer=?` to tell gradle to build a selected MC version instead of having to modify the `gradle.properties` file.\
|
||||||
> Example: `./gradlew assemble -PmcVer=1.18.2`
|
> For example: `./gradlew assemble -PmcVer=1.18.2`
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@@ -162,7 +157,6 @@ Run tests with: `./gradlew test`
|
|||||||
|
|
||||||
You can also locally compile the DH jars without a Java environment by using Docker. Where `<version>` is the version of Minecraft to compile for (ie `1.20.1`), or the keyword `all`. See [Versions](#minecraft-and-library-versions) for a list of all supported values.
|
You can also locally compile the DH jars without a Java environment by using Docker. Where `<version>` is the version of Minecraft to compile for (ie `1.20.1`), or the keyword `all`. See [Versions](#minecraft-and-library-versions) for a list of all supported values.
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## Other commands
|
## Other commands
|
||||||
@@ -171,6 +165,7 @@ You can also locally compile the DH jars without a Java environment by using Doc
|
|||||||
|
|
||||||
`./gradlew clean` to delete any compiled code.
|
`./gradlew clean` to delete any compiled code.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
## Note to self
|
## Note to self
|
||||||
|
|
||||||
@@ -178,7 +173,7 @@ The Minecraft source code is NOT added to your workspace in an editable way. Min
|
|||||||
|
|
||||||
Source code uses Mojang mappings & [Parchment](https://parchmentmc.org/) mappings.
|
Source code uses Mojang mappings & [Parchment](https://parchmentmc.org/) mappings.
|
||||||
|
|
||||||
To generate the source code run `./gradlew genSources`\
|
To generate the source code run `./gradlew genSources` <br>
|
||||||
If your IDE fails to auto-detect the source jars when browsing Minecraft classes; manually select the JAR file ending with -sources.jar when prompted by your IDE. <br>
|
If your IDE fails to auto-detect the source jars when browsing Minecraft classes; manually select the JAR file ending with -sources.jar when prompted by your IDE. <br>
|
||||||
(In IntelliJ it's at the top where it says "choose sources" when browsing a Minecraft class)
|
(In IntelliJ it's at the top where it says "choose sources" when browsing a Minecraft class)
|
||||||
|
|
||||||
@@ -186,12 +181,12 @@ If your IDE fails to auto-detect the source jars when browsing Minecraft classes
|
|||||||
|
|
||||||
## Other Useful commands
|
## Other Useful commands
|
||||||
|
|
||||||
Run the standalone jar: `./gradlew run`\
|
Run the standalone jar: `./gradlew run` <br>
|
||||||
Build the standalone jar: `./gradlew core:build`\
|
Build the standalone jar: `./gradlew core:build` <br>
|
||||||
Only build Fabric: `./gradlew fabric:assemble` or `./gradlew fabric:build`\
|
Only build Fabric: `./gradlew fabric:assemble` or `./gradlew fabric:build` <br>
|
||||||
Only build Forge: `./gradlew fabric:assemble` or `./gradlew forge:build`\
|
Only build Forge: `./gradlew forge:assemble` or `./gradlew forge:build` <br>
|
||||||
Run the Fabric client (for debugging): `./gradlew fabric:runClient`\
|
Run the Fabric client (for debugging): `./gradlew fabric:runClient` <br>
|
||||||
Run the Forge client (for debugging): `./gradlew forge:runClient`
|
Run the Forge client (for debugging): `./gradlew forge:runClient` <br>
|
||||||
|
|
||||||
To build all versions: `./buildAll` (all builds will end up in the `Merged` folder)
|
To build all versions: `./buildAll` (all builds will end up in the `Merged` folder)
|
||||||
|
|
||||||
@@ -205,7 +200,7 @@ https://github.com/PacifistMC/Forgix
|
|||||||
LZ4 for Java (data compression)\
|
LZ4 for Java (data compression)\
|
||||||
https://github.com/lz4/lz4-java
|
https://github.com/lz4/lz4-java
|
||||||
|
|
||||||
NightConfig for Json & Toml (config handling)\
|
NightConfig for JSON & TOML (config handling)\
|
||||||
https://github.com/TheElectronWill/night-config
|
https://github.com/TheElectronWill/night-config
|
||||||
|
|
||||||
SVG Salamander for SVG support (not being used atm)\
|
SVG Salamander for SVG support (not being used atm)\
|
||||||
|
|||||||
+128
-129
@@ -2,21 +2,16 @@ plugins {
|
|||||||
id "java"
|
id "java"
|
||||||
|
|
||||||
// Plugin to put dependencies inside our final jar
|
// Plugin to put dependencies inside our final jar
|
||||||
id "com.github.johnrengelman.shadow" version '7.1.2' apply false
|
id "com.github.johnrengelman.shadow" version '8.1.1' apply false
|
||||||
|
|
||||||
// Plugin to create merged jars
|
// Plugin to create merged jars
|
||||||
id "io.github.pacifistmc.forgix" version "1.2.6"
|
id "io.github.pacifistmc.forgix" version "1.2.9"
|
||||||
|
|
||||||
// Unimined is our all in one solution to minecraft loaders
|
// Manifold preprocessor
|
||||||
// id "xyz.wagyourtail.unimined" version "1.2.0-SNAPSHOT" apply false // Unstable Release (TODO: Check back to see when the unstable branch fixes forge run without the jank)
|
id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha"
|
||||||
id "xyz.wagyourtail.unimined" version "1.1.2-SNAPSHOT" apply false // LTS Release
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Architectury is used here only as a replacement for forge's own loom
|
||||||
// Transfers the values set in settings.gradle to the rest of the project
|
id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false
|
||||||
project.gradle.ext.getProperties().each { prop ->
|
|
||||||
rootProject.ext.set(prop.key, prop.value)
|
|
||||||
// println "Added prop [key:" + prop.key + ", value:" + prop.value + "]"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -54,6 +49,14 @@ def writeBuildGradlePredefine(List<String> mcVers, int mcIndex)
|
|||||||
|
|
||||||
new File(projectDir, "build.properties").text = sb.toString()
|
new File(projectDir, "build.properties").text = sb.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Transfers the values set in settings.gradle to the rest of the project
|
||||||
|
project.gradle.ext.getProperties().each { prop ->
|
||||||
|
rootProject.ext.set(prop.key, prop.value)
|
||||||
|
// println "Added prop [key:" + prop.key + ", value:" + prop.value + "]"
|
||||||
|
}
|
||||||
|
// Sets up manifold stuff
|
||||||
writeBuildGradlePredefine(rootProject.mcVers, rootProject.mcIndex)
|
writeBuildGradlePredefine(rootProject.mcVers, rootProject.mcIndex)
|
||||||
|
|
||||||
|
|
||||||
@@ -61,7 +64,6 @@ writeBuildGradlePredefine(rootProject.mcVers, rootProject.mcIndex)
|
|||||||
|
|
||||||
// Sets up the version string (the name we use for our jar)
|
// Sets up the version string (the name we use for our jar)
|
||||||
rootProject.versionStr = rootProject.mod_version + "-" + rootProject.minecraft_version // + "-" + new Date().format("yyyy_MM_dd_HH_mm")
|
rootProject.versionStr = rootProject.mod_version + "-" + rootProject.minecraft_version // + "-" + new Date().format("yyyy_MM_dd_HH_mm")
|
||||||
|
|
||||||
// Forgix settings (used for merging jars)
|
// Forgix settings (used for merging jars)
|
||||||
forgix {
|
forgix {
|
||||||
group = "com.seibel.distanthorizons"
|
group = "com.seibel.distanthorizons"
|
||||||
@@ -92,7 +94,7 @@ forgix {
|
|||||||
}
|
}
|
||||||
|
|
||||||
subprojects { p ->
|
subprojects { p ->
|
||||||
// Does the same as "p == project(":common") || p == project(":fabric") || p == project(":forge") || p == project("WhateverLoaderWeAddLaterOn")"
|
// Does the same as "p == project(":common") || p == project(":fabric") || p == project(":quilt") || p == project(":forge") || p == project("WhateverWeAddLaterOn")"
|
||||||
// Useful later on so we dont have duplicated code
|
// Useful later on so we dont have duplicated code
|
||||||
def isMinecraftSubProject = p != project(":core") && p != project(":api")
|
def isMinecraftSubProject = p != project(":core") && p != project(":api")
|
||||||
|
|
||||||
@@ -100,79 +102,73 @@ subprojects { p ->
|
|||||||
// Apply plugins
|
// Apply plugins
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
apply plugin: "com.github.johnrengelman.shadow"
|
apply plugin: "com.github.johnrengelman.shadow"
|
||||||
if (p == project(":core"))
|
if (isMinecraftSubProject)
|
||||||
apply plugin: "application"
|
apply plugin: "systems.manifold.manifold-gradle-plugin"
|
||||||
|
|
||||||
if (isMinecraftSubProject) {
|
// Apply forge's loom
|
||||||
apply plugin: "xyz.wagyourtail.unimined"
|
if (
|
||||||
|
(findProject(":forge") && p == project(":forge")) ||
|
||||||
|
(findProject(":neoforge") && p == project(":neoforge"))
|
||||||
|
)
|
||||||
|
apply plugin: "dev.architectury.loom"
|
||||||
|
|
||||||
unimined.minecraft(sourceSets.main, true) {
|
|
||||||
version = rootProject.minecraft_version
|
|
||||||
|
|
||||||
def parchmentVersionParts = rootProject.parchment_version.split(":")
|
// Set the manifold version (may not be required tough)
|
||||||
mappings {
|
manifold {
|
||||||
mojmap()
|
manifoldVersion = rootProject.manifold_version
|
||||||
parchment(parchmentVersionParts[0], parchmentVersionParts[1])
|
|
||||||
devNamespace "mojmap"
|
|
||||||
}
|
|
||||||
|
|
||||||
runs {
|
|
||||||
config("client") {
|
|
||||||
workingDir = rootProject.file("run")
|
|
||||||
}
|
|
||||||
config("server") {
|
|
||||||
workingDir = rootProject.file("run") // TODO: When running the server, would it be a better idea to change this to a different dir?
|
|
||||||
disabled = true // TODO: Once server-side support is added, remove this
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p != project(":common")) {
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
|
||||||
source(project(":common").sourceSets.main.java)
|
|
||||||
source(project(":api").sourceSets.main.java)
|
|
||||||
source(project(":core").sourceSets.main.java)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType(GenerateModuleMetadata) {
|
|
||||||
enabled = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable testing for projects that aren't the core or api project.
|
|
||||||
// If not done compiling will fail due to an issue with Manifold
|
|
||||||
if (isMinecraftSubProject) {
|
|
||||||
test {
|
|
||||||
enabled = false
|
|
||||||
}
|
|
||||||
compileTestJava {
|
|
||||||
enabled = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// set up custom configurations (configurations are a way to handle dependencies)
|
// set up custom configurations (configurations are a way to handle dependencies)
|
||||||
configurations {
|
configurations {
|
||||||
// extends the shadowJar configuration
|
// extends the shadowJar configuration
|
||||||
shadowMc // Configuration that doesn't contain coreProjects
|
shadowMe
|
||||||
|
|
||||||
// have implemented dependencies automatically embedded in the final jar
|
// have implemented dependencies automatically embedded in the final jar
|
||||||
implementation.extendsFrom(shadowMc)
|
implementation.extendsFrom(shadowMe)
|
||||||
|
|
||||||
// Add shaded libraries very early in the classpath (excluding coreProjects as that's added in a different way)
|
// Configuration fpr core & api
|
||||||
minecraftLibraries.extendsFrom(shadowMc)
|
coreProjects
|
||||||
}
|
shadowMe.extendsFrom(coreProjects)
|
||||||
|
|
||||||
|
|
||||||
// Let the application plugin know where the main class is
|
// FIXME this additional configuration is necessary because forge
|
||||||
// (This will point to a non-existent class in all sub-projects except "Core")
|
// needs forgeRuntimeLibrary, although adding it to shadowMe
|
||||||
if (p == project(":core")) {
|
// causes runtime issues where the libraries aren't properly added
|
||||||
application {
|
forgeShadowMe
|
||||||
mainClass.set("com.seibel.distanthorizons.core.jar.JarMain")
|
// this should match shadowMe pretty closely
|
||||||
|
implementation.extendsFrom(forgeShadowMe)
|
||||||
|
shadowMe.extendsFrom(forgeShadowMe)
|
||||||
|
forgeRuntimeLibrary.extendsFrom(forgeShadowMe)
|
||||||
|
|
||||||
|
|
||||||
|
if (isMinecraftSubProject && p != project(":common")) {
|
||||||
|
// Shadow common
|
||||||
|
common
|
||||||
|
shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
|
||||||
|
compileClasspath.extendsFrom common
|
||||||
|
runtimeClasspath.extendsFrom common
|
||||||
|
if (findProject(":forge"))
|
||||||
|
developmentForge.extendsFrom common
|
||||||
|
if (findProject(":neoforge"))
|
||||||
|
developmentNeoForge.extendsFrom common
|
||||||
|
compileClasspath.extendsFrom coreProjects
|
||||||
|
runtimeClasspath.extendsFrom coreProjects
|
||||||
|
if (findProject(":forge"))
|
||||||
|
developmentForge.extendsFrom coreProjects
|
||||||
|
if (findProject(":neoforge"))
|
||||||
|
developmentNeoForge.extendsFrom coreProjects
|
||||||
|
|
||||||
|
if (findProject(":fabricLike") && p != project(":fabricLike")) {
|
||||||
|
// Shadow fabricLike
|
||||||
|
fabricLike
|
||||||
|
shadowFabricLike
|
||||||
|
compileClasspath.extendsFrom fabricLike
|
||||||
|
runtimeClasspath.extendsFrom fabricLike
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
//=====================//
|
//=====================//
|
||||||
// shared dependencies //
|
// shared dependencies //
|
||||||
@@ -184,41 +180,48 @@ subprojects { p ->
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log4j
|
// Log4j
|
||||||
// TODO: Change to shadowCore later to work in the standalone jar
|
// TODO: Change to shadowMe later to work in the standalone jar
|
||||||
// We cannot do this now as it would break Quilt
|
// We cannot do this now as it would break Quilt
|
||||||
implementation("org.apache.logging.log4j:log4j-api:${rootProject.log4j_version}")
|
implementation("org.apache.logging.log4j:log4j-api:${rootProject.log4j_version}")
|
||||||
implementation("org.apache.logging.log4j:log4j-core:${rootProject.log4j_version}")
|
implementation("org.apache.logging.log4j:log4j-core:${rootProject.log4j_version}")
|
||||||
|
|
||||||
|
// JOML
|
||||||
|
if (project.hasProperty("embed_joml") && embed_joml == "true")
|
||||||
|
forgeShadowMe("org.joml:joml:${rootProject.joml_version}")
|
||||||
|
else
|
||||||
|
implementation("org.joml:joml:${rootProject.joml_version}")
|
||||||
|
|
||||||
// JUnit tests
|
// JUnit tests
|
||||||
implementation("org.junit.jupiter:junit-jupiter:5.8.2")
|
implementation("org.junit.jupiter:junit-jupiter:5.8.2")
|
||||||
implementation("org.junit.jupiter:junit-jupiter-engine:5.8.2")
|
implementation("org.junit.jupiter:junit-jupiter-engine:5.8.2")
|
||||||
implementation("junit:junit:4.13")
|
implementation("junit:junit:4.13")
|
||||||
|
|
||||||
// JOML
|
// FastUtil
|
||||||
if (project.hasProperty("embed_joml") && embed_joml == "true")
|
// Note: MC 1.16 uses 8.2.1, and versions after use 8.5.12
|
||||||
shadowMc("org.joml:joml:${rootProject.joml_version}")
|
// We cannot relocate this library since we call some MC classes that reference it
|
||||||
else
|
implementation("it.unimi.dsi:fastutil:${rootProject.fastutil_version}")
|
||||||
implementation("org.joml:joml:${rootProject.joml_version}")
|
|
||||||
|
|
||||||
// Compression
|
// Compression
|
||||||
shadowMc("org.lz4:lz4-java:${rootProject.lz4_version}")
|
forgeShadowMe("org.lz4:lz4-java:${rootProject.lz4_version}") // LZ4
|
||||||
|
forgeShadowMe("org.tukaani:xz:${rootProject.xz_version}") // LZMA
|
||||||
|
|
||||||
// Sqlite Database
|
// Sqlite Database
|
||||||
shadowMc("org.xerial:sqlite-jdbc:${rootProject.sqlite_jdbc_version}")
|
forgeShadowMe("org.xerial:sqlite-jdbc:${rootProject.sqlite_jdbc_version}")
|
||||||
|
|
||||||
// NightConfig (includes Toml & Json)
|
// NightConfig (includes Toml & Json)
|
||||||
shadowMc("com.electronwill.night-config:toml:${rootProject.nightconfig_version}")
|
forgeShadowMe("com.electronwill.night-config:toml:${rootProject.nightconfig_version}")
|
||||||
shadowMc("com.electronwill.night-config:json:${rootProject.nightconfig_version}")
|
forgeShadowMe("com.electronwill.night-config:json:${rootProject.nightconfig_version}")
|
||||||
|
|
||||||
// SVG (not needed atm)
|
// SVG (not needed atm)
|
||||||
//shadowMc("com.formdev:svgSalamander:${rootProject.svgSalamander_version}")
|
// forgeShadowMe("com.formdev:svgSalamander:${rootProject.svgSalamander_version}")
|
||||||
|
|
||||||
// Netty
|
// Netty
|
||||||
// Breaks 1.16.5
|
// Breaks 1.16.5
|
||||||
//shadowMc("io.netty:netty-all:${rootProject.netty_version}")
|
//forgeShadowMe("io.netty:netty-all:${rootProject.netty_version}")
|
||||||
|
|
||||||
// Remember, for lwjgl dependencies that arent included in Minecraft, you need to also need to add it to the ShadowJar thing
|
// Remember, for lwjgl dependencies that arent included in Minecraft, you need to also need to add it to the ShadowJar thing
|
||||||
shadowMc("org.lwjgl:lwjgl-jawt:${rootProject.lwjgl_version}") {
|
forgeShadowMe("org.lwjgl:lwjgl-jawt:${rootProject.lwjgl_version}") {
|
||||||
exclude group: "org.lwjgl", module: "lwjgl" // This module is imported by Minecraft so exclude it
|
exclude group: "org.lwjgl", module: "lwjgl" // This module is imported by Minecraft so exclude it
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,12 +234,11 @@ subprojects { p ->
|
|||||||
|
|
||||||
// Add core
|
// Add core
|
||||||
if (isMinecraftSubProject) {
|
if (isMinecraftSubProject) {
|
||||||
compileOnly(project(":core")) {
|
coreProjects(project(":core")) {
|
||||||
// Remove Junit test libraries
|
// Remove Junit test libraries
|
||||||
exclude group: "org.junit.jupiter", module: "junit-jupiter"
|
exclude group: "org.junit.jupiter", module: "junit-jupiter"
|
||||||
exclude group: "org.junit.jupiter", module: "junit-jupiter-engine"
|
exclude group: "org.junit.jupiter", module: "junit-jupiter-engine"
|
||||||
exclude group: "junit", module: "junit"
|
exclude group: "junit", module: "junit"
|
||||||
|
|
||||||
// Removed dependencies
|
// Removed dependencies
|
||||||
transitive false
|
transitive false
|
||||||
}
|
}
|
||||||
@@ -244,12 +246,11 @@ subprojects { p ->
|
|||||||
|
|
||||||
// Add the api
|
// Add the api
|
||||||
if (p != project(":api")) {
|
if (p != project(":api")) {
|
||||||
implementation(project(":api")) {
|
coreProjects(project(":api")) {
|
||||||
// Remove Junit test libraries
|
// Remove Junit test libraries
|
||||||
exclude group: "org.junit.jupiter", module: "junit-jupiter"
|
exclude group: "org.junit.jupiter", module: "junit-jupiter"
|
||||||
exclude group: "org.junit.jupiter", module: "junit-jupiter-engine"
|
exclude group: "org.junit.jupiter", module: "junit-jupiter-engine"
|
||||||
exclude group: "junit", module: "junit"
|
exclude group: "junit", module: "junit"
|
||||||
|
|
||||||
// Removed dependencies
|
// Removed dependencies
|
||||||
transitive false
|
transitive false
|
||||||
}
|
}
|
||||||
@@ -258,20 +259,30 @@ subprojects { p ->
|
|||||||
// Add common
|
// Add common
|
||||||
if (isMinecraftSubProject && p != project(":common")) {
|
if (isMinecraftSubProject && p != project(":common")) {
|
||||||
// Common
|
// Common
|
||||||
compileOnly(project(":common")) { transitive false }
|
common(project(":common")) { transitive false }
|
||||||
|
shadowCommon(project(":common")) { transitive false }
|
||||||
|
|
||||||
|
// FabricLike
|
||||||
|
if (findProject(":fabricLike") && p != project(":fabricLike")) {
|
||||||
|
fabricLike(project(path: ":fabricLike")) { transitive false }
|
||||||
|
shadowFabricLike(project(path: ":fabricLike")) { transitive false }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
shadowJar {
|
shadowJar {
|
||||||
configurations = [project.configurations.shadowMc]
|
configurations = [project.configurations.shadowMe]
|
||||||
|
|
||||||
if (isMinecraftSubProject && p != project(":common")) {
|
if (isMinecraftSubProject && p != project(":common")) {
|
||||||
|
configurations.push(project.configurations.shadowCommon) // Shadow the common subproject
|
||||||
relocate "com.seibel.distanthorizons.common", "loaderCommon.${p.name}.com.seibel.distanthorizons.common" // Move the loader files to a different location
|
relocate "com.seibel.distanthorizons.common", "loaderCommon.${p.name}.com.seibel.distanthorizons.common" // Move the loader files to a different location
|
||||||
|
|
||||||
|
if (findProject(":fabricLike") && p != project(":fabricLike")) {
|
||||||
|
configurations.push(project.configurations.shadowFabricLike) // Shadow the fabricLike subproject
|
||||||
|
relocate "com.seibel.distanthorizons.fabriclike", "loaderCommon.${p.name}.com.seibel.distanthorizons.fabriclike" // Move the loader files to a different location
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
def librariesLocation = "DistantHorizons.libraries"
|
||||||
|
|
||||||
def librariesLocation = "distanthorizons.libraries"
|
|
||||||
|
|
||||||
// LWJGL
|
// LWJGL
|
||||||
// Only ever shadow the dependencies we use otherwise some stuff would break when running on an external client
|
// Only ever shadow the dependencies we use otherwise some stuff would break when running on an external client
|
||||||
@@ -305,33 +316,21 @@ subprojects { p ->
|
|||||||
|
|
||||||
// Put stuff from gradle.properties into the mod info
|
// Put stuff from gradle.properties into the mod info
|
||||||
processResources {
|
processResources {
|
||||||
duplicatesStrategy = DuplicatesStrategy.WARN
|
def resourceTargets = [ // Location of where to inject the properties
|
||||||
// Include all the resources
|
// Holds info like git commit
|
||||||
from project(":common").sourceSets.main.resources
|
// TODO: For some reason this script doesnt work with the core project
|
||||||
from project(":core").sourceSets.main.resources
|
"build_info.json",
|
||||||
from project(":api").sourceSets.main.resources
|
|
||||||
|
|
||||||
// Copy accessWideners
|
// Properties for each of the loaders
|
||||||
// FIXME: remove copyCommonLoaderResources and use this instead (and if you are removing that task, also remove copyCoreResources while your at it)
|
"fabric.mod.json",
|
||||||
// from project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
|
"quilt.mod.json",
|
||||||
// into(file(p.file("build/resources/main")))
|
"META-INF/mods.toml",
|
||||||
rename "${accessWidenerVersion}.distanthorizons.accesswidener", "distanthorizons.accesswidener"
|
"META-INF/neoforge.mods.toml",
|
||||||
|
|
||||||
// Location of where to inject the properties
|
// The mixins for each of the loaders
|
||||||
def resourceTargets = [
|
"DistantHorizons."+ p.name +".fabricLike.mixins.json"
|
||||||
// Holds info like git commit
|
|
||||||
// TODO: For some reason this script doesnt work with the core project
|
|
||||||
"build_info.json",
|
|
||||||
|
|
||||||
// Properties for each of the loaders
|
|
||||||
"fabric.mod.json",
|
|
||||||
"quilt.mod.json",
|
|
||||||
"META-INF/mods.toml",
|
|
||||||
|
|
||||||
// The mixins for each of the loaders
|
|
||||||
"DistantHorizons."+ p.name +".fabricLike.mixins.json"
|
|
||||||
]
|
]
|
||||||
def buildResourceTargets = ["$buildDir/resources/main/"] // Location of the built resources folder
|
def intoTargets = ["$buildDir/resources/main/"] // Location of the built resources folder
|
||||||
|
|
||||||
// Fix forge version numbering system as it is weird
|
// Fix forge version numbering system as it is weird
|
||||||
// For whatever reason forge uses [1.18, 1.18.1, 1.18.2) instead of the standard ["1.18", "1.18.1", "1.18.2"]
|
// For whatever reason forge uses [1.18, 1.18.1, 1.18.2) instead of the standard ["1.18", "1.18.1", "1.18.2"]
|
||||||
@@ -339,7 +338,7 @@ subprojects { p ->
|
|||||||
// println compatible_forgemc_versions
|
// println compatible_forgemc_versions
|
||||||
|
|
||||||
// Quilt's custom contributors system
|
// Quilt's custom contributors system
|
||||||
// has to be in the format:
|
// This has to be like
|
||||||
// "Person": "Developer", "Another person": "Developer"
|
// "Person": "Developer", "Another person": "Developer"
|
||||||
def quilt_contributors = []
|
def quilt_contributors = []
|
||||||
def mod_author_list = mod_authors.replaceAll("\"", "").replace("[", "").replace("]", "").split(",")
|
def mod_author_list = mod_authors.replaceAll("\"", "").replace("[", "").replace("]", "").split(",")
|
||||||
@@ -391,14 +390,12 @@ subprojects { p ->
|
|||||||
|
|
||||||
// replace any properties in the sub-projects with the values defined here
|
// replace any properties in the sub-projects with the values defined here
|
||||||
inputs.properties replaceProperties
|
inputs.properties replaceProperties
|
||||||
replaceProperties.put("project", project)
|
replaceProperties.put "project", project
|
||||||
filesMatching(resourceTargets) {
|
filesMatching(resourceTargets) {
|
||||||
expand replaceProperties
|
expand replaceProperties
|
||||||
}
|
}
|
||||||
|
|
||||||
|
intoTargets.each { target ->
|
||||||
// copy all our resources into the loader specific resource directory
|
|
||||||
buildResourceTargets.each { target ->
|
|
||||||
if (file(target).exists()) {
|
if (file(target).exists()) {
|
||||||
copy {
|
copy {
|
||||||
from(sourceSets.main.resources) {
|
from(sourceSets.main.resources) {
|
||||||
@@ -562,7 +559,6 @@ allprojects { p ->
|
|||||||
// Set the OS lwjgl is using to the current os
|
// Set the OS lwjgl is using to the current os
|
||||||
project.ext.lwjglNatives = "natives-" + os.toFamilyName()
|
project.ext.lwjglNatives = "natives-" + os.toFamilyName()
|
||||||
|
|
||||||
// TODO: Include Minecraft in core-projects but dont include MC code stuff
|
|
||||||
dependencies { // All of these dependencies are in Vanilla Minecraft, but we need to depend on it as we arent importing Minecraft in the core
|
dependencies { // All of these dependencies are in Vanilla Minecraft, but we need to depend on it as we arent importing Minecraft in the core
|
||||||
// Imports most of lwjgl's libraries (well, only the ones that we need)
|
// Imports most of lwjgl's libraries (well, only the ones that we need)
|
||||||
implementation platform("org.lwjgl:lwjgl-bom:${rootProject.lwjgl_version}") // TODO: Use Minecraft's version for lwjgl_version (which changes in nearly every version) instead of a hard defined version for all versions
|
implementation platform("org.lwjgl:lwjgl-bom:${rootProject.lwjgl_version}") // TODO: Use Minecraft's version for lwjgl_version (which changes in nearly every version) instead of a hard defined version for all versions
|
||||||
@@ -590,27 +586,30 @@ allprojects { p ->
|
|||||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||||
implementation("com.google.common:google-collect:0.5")
|
implementation("com.google.common:google-collect:0.5")
|
||||||
implementation("com.google.guava:guava:31.1-jre")
|
implementation("com.google.guava:guava:31.1-jre")
|
||||||
implementation("it.unimi.dsi:fastutil:8.5.11")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: Remove this as no loader needs this
|
|
||||||
// - Fabric can rename which aw they use
|
|
||||||
// - (Neo)Forge converts the aw to their own at, which is stored at a different place
|
|
||||||
task copyCommonLoaderResources(type: Copy) {
|
task copyCommonLoaderResources(type: Copy) {
|
||||||
from project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
|
from project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
|
||||||
into(file(p.file("build/resources/main")))
|
into(file(p.file("build/resources/main")))
|
||||||
rename "${accessWidenerVersion}.distanthorizons.accesswidener", "distanthorizons.accesswidener"
|
rename "${accessWidenerVersion}.distanthorizons.accesswidener", "distanthorizons.accesswidener"
|
||||||
|
|
||||||
|
|
||||||
|
// Move the fabricLike mixin to its different places for each subproject
|
||||||
|
if (findProject(":fabricLike")) {
|
||||||
|
from project(":fabricLike").file("src/main/resources/DistantHorizons.fabricLike.mixins.json")
|
||||||
|
into(file(p.file("build/resources/main")))
|
||||||
|
rename "DistantHorizons.fabricLike.mixins.json", "DistantHorizons." + p.name + ".fabricLike.mixins.json"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Remove this later as we no longer need this. We are now including the resources in the processResources section
|
|
||||||
task copyCoreResources(type: Copy) {
|
task copyCoreResources(type: Copy) {
|
||||||
from fileTree(project(":core").file("src/main/resources"))
|
from fileTree(project(":core").file("src/main/resources"))
|
||||||
into p.file("build/resources/main")
|
into p.file("build/resources/main")
|
||||||
}
|
}
|
||||||
|
|
||||||
compileJava {
|
tasks.withType(JavaCompile) {
|
||||||
if (isMinecraftSubProject) {
|
if (isMinecraftSubProject) {
|
||||||
options.release = rootProject.java_version as Integer
|
options.release = rootProject.java_version as Integer
|
||||||
options.compilerArgs += ["-Xplugin:Manifold"]
|
options.compilerArgs += ["-Xplugin:Manifold"]
|
||||||
|
|||||||
+24
-10
@@ -1,16 +1,30 @@
|
|||||||
// Use Unimined's implimentation for MC as we can use Parchment mappings in common now! :tada:
|
|
||||||
// With Sponge's vanilla gradle, we cannot change the mappings to anything out of mojmaps
|
|
||||||
unimined.minecraft {
|
|
||||||
fabric { // TODO: Find a way to only include the mc stuff, not fabric's loader
|
|
||||||
loader rootProject.fabric_loader_version
|
|
||||||
accessWidener(project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener"))
|
|
||||||
|
|
||||||
skipInsertAw = true
|
plugins {
|
||||||
}
|
id "org.spongepowered.gradle.vanilla" version "0.2.1-SNAPSHOT"
|
||||||
|
}
|
||||||
|
|
||||||
defaultRemapJar = false
|
minecraft {
|
||||||
|
accessWideners(project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener"))
|
||||||
|
version(rootProject.minecraft_version)
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
// So mixins can be written in common
|
||||||
|
compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
publications {
|
||||||
|
mavenCommon(MavenPublication) {
|
||||||
|
artifactId = rootProject.mod_readable_name
|
||||||
|
from components.java
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
|
||||||
|
repositories {
|
||||||
|
// Add repositories to publish to here.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -166,10 +166,7 @@ public abstract class AbstractModInitializer
|
|||||||
LOGGER.info("Mod Post-Initialized");
|
LOGGER.info("Mod Post-Initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initCommands()
|
private void initCommands() { /* currently unimplemented */ }
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
-94
@@ -1,94 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.common.rendering;
|
|
||||||
|
|
||||||
#if MC_VER < MC_1_19_4
|
|
||||||
import com.mojang.math.Matrix4f;
|
|
||||||
#else
|
|
||||||
import org.joml.Matrix4f;
|
|
||||||
#endif
|
|
||||||
import com.seibel.distanthorizons.core.config.Config;
|
|
||||||
import com.seibel.distanthorizons.core.util.RenderUtil;
|
|
||||||
import com.seibel.distanthorizons.coreapi.util.math.Mat4f;
|
|
||||||
import org.lwjgl.opengl.GL15;
|
|
||||||
|
|
||||||
import java.nio.FloatBuffer;
|
|
||||||
|
|
||||||
public class SeamlessOverdraw
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Proof-of-concept experimental option, not intended for normal use. <br>
|
|
||||||
* (Poorly) replaces Minecraft's far clip plane so it lines up with DH's near clip plane.
|
|
||||||
*/
|
|
||||||
public static float[] overwriteMinecraftNearFarClipPlanes(Matrix4f minecraftProjectionMatrix, float previousPartialTicks)
|
|
||||||
{
|
|
||||||
float[] matrixFloatArray;
|
|
||||||
|
|
||||||
#if MC_VER < MC_1_19_4
|
|
||||||
FloatBuffer matrixFloatBuffer = FloatBuffer.allocate(16);
|
|
||||||
minecraftProjectionMatrix.store(matrixFloatBuffer);
|
|
||||||
matrixFloatArray = matrixFloatBuffer.array();
|
|
||||||
#else
|
|
||||||
// Passing float buffers in caused native code crashes, so we are passing in a float array instead
|
|
||||||
matrixFloatArray = new float[16];
|
|
||||||
minecraftProjectionMatrix.get(matrixFloatArray);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return overwriteMinecraftNearFarClipPlanes(matrixFloatArray, previousPartialTicks);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float[] overwriteMinecraftNearFarClipPlanes(Mat4f minecraftProjectionMatrix, float previousPartialTicks)
|
|
||||||
{
|
|
||||||
return overwriteMinecraftNearFarClipPlanes(minecraftProjectionMatrix.getValuesAsArray(), previousPartialTicks);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static float[] overwriteMinecraftNearFarClipPlanes(float[] projectionMatrixFloatArray, float previousPartialTicks)
|
|
||||||
{
|
|
||||||
float dhFarClipPlane = RenderUtil.getNearClipPlaneDistanceInBlocks(previousPartialTicks);
|
|
||||||
|
|
||||||
// works for fabric, bad not for forge for some reason :/
|
|
||||||
float farClip = dhFarClipPlane * 5.1f; // magic number found via trial and error, James has no idea what it represents, except that it makes the seam between DH and vanilla rendering pretty close
|
|
||||||
float nearClip = 0.5f; // this causes issues with some vanilla rendering, specifically the wireframe around selected blocks is slightly off. Unfortunately the ratio between the near and far clip plane can't be easily modified without completely screwing up the rendering.
|
|
||||||
|
|
||||||
// these may be the wrong index locations in any version of MC other than 1.18.2
|
|
||||||
projectionMatrixFloatArray[10] = -((farClip + nearClip) / (farClip - nearClip)); // near clip plane
|
|
||||||
projectionMatrixFloatArray[11] = -((2 * farClip * nearClip) / (farClip - nearClip)); // far clip plane
|
|
||||||
|
|
||||||
|
|
||||||
return projectionMatrixFloatArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//================//
|
|
||||||
// helper methods //
|
|
||||||
//================//
|
|
||||||
|
|
||||||
public static void applyLegacyProjectionMatrix(float[] projectionMatrixFloatArray)
|
|
||||||
{
|
|
||||||
int glMatrixMode = GL15.glGetInteger(GL15.GL_MATRIX_MODE);
|
|
||||||
GL15.glMatrixMode(GL15.GL_PROJECTION);
|
|
||||||
|
|
||||||
GL15.glLoadMatrixf(projectionMatrixFloatArray);
|
|
||||||
|
|
||||||
GL15.glMatrixMode(glMatrixMode);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
+19
-7
@@ -32,6 +32,7 @@ import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
|
|||||||
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
|
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
|
||||||
import com.seibel.distanthorizons.core.level.IDhLevel;
|
import com.seibel.distanthorizons.core.level.IDhLevel;
|
||||||
import com.seibel.distanthorizons.core.level.IDhServerLevel;
|
import com.seibel.distanthorizons.core.level.IDhServerLevel;
|
||||||
|
import com.seibel.distanthorizons.core.util.LodUtil;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
||||||
@@ -83,10 +84,21 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBiomeWrapper deserializeBiomeWrapper(String str, ILevelWrapper levelWrapper) throws IOException { return BiomeWrapper.deserialize(str, levelWrapper); }
|
public IBiomeWrapper deserializeBiomeWrapper(String str, ILevelWrapper levelWrapper) throws IOException { return BiomeWrapper.deserialize(str, levelWrapper); }
|
||||||
|
@Override
|
||||||
|
public IBiomeWrapper getPlainsBiomeWrapper(ILevelWrapper levelWrapper) // TODO is there a way we could get this without the levelWrapper? it isn't necessary but would clean up the code a bit
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return BiomeWrapper.deserialize(BiomeWrapper.PLAINS_RESOURCE_LOCATION_STRING, levelWrapper);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
throw new LodUtil.AssertFailureException("Unable to parse plains resource string ["+BiomeWrapper.PLAINS_RESOURCE_LOCATION_STRING+"], error:\n " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockStateWrapper deserializeBlockStateWrapper(String str, ILevelWrapper levelWrapper) throws IOException { return BlockStateWrapper.deserialize(str, levelWrapper); }
|
public IBlockStateWrapper deserializeBlockStateWrapper(String str, ILevelWrapper levelWrapper) throws IOException { return BlockStateWrapper.deserialize(str, levelWrapper); }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockStateWrapper getAirBlockStateWrapper() { return BlockStateWrapper.AIR; }
|
public IBlockStateWrapper getAirBlockStateWrapper() { return BlockStateWrapper.AIR; }
|
||||||
|
|
||||||
@@ -118,7 +130,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MC_VER <= MC_1_20_4
|
#if MC_VER <= MC_1_20_6
|
||||||
else if (objectArray.length == 2)
|
else if (objectArray.length == 2)
|
||||||
{
|
{
|
||||||
// correct number of parameters from the API
|
// correct number of parameters from the API
|
||||||
@@ -183,7 +195,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
{
|
{
|
||||||
String[] expectedClassNames;
|
String[] expectedClassNames;
|
||||||
|
|
||||||
#if MC_VER <= MC_1_20_4
|
#if MC_VER <= MC_1_20_6
|
||||||
expectedClassNames = new String[]
|
expectedClassNames = new String[]
|
||||||
{
|
{
|
||||||
ChunkAccess.class.getName(),
|
ChunkAccess.class.getName(),
|
||||||
@@ -231,7 +243,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
Biome biome = (Biome) objectArray[0];
|
Biome biome = (Biome) objectArray[0];
|
||||||
return BiomeWrapper.getBiomeWrapper(biome, coreLevelWrapper);
|
return BiomeWrapper.getBiomeWrapper(biome, coreLevelWrapper);
|
||||||
#elif MC_VER <= MC_1_20_4
|
#elif MC_VER <= MC_1_20_6
|
||||||
if (!(objectArray[0] instanceof Holder) || !(((Holder<?>) objectArray[0]).value() instanceof Biome))
|
if (!(objectArray[0] instanceof Holder) || !(((Holder<?>) objectArray[0]).value() instanceof Biome))
|
||||||
{
|
{
|
||||||
throw new ClassCastException(createBiomeWrapperErrorMessage(objectArray));
|
throw new ClassCastException(createBiomeWrapperErrorMessage(objectArray));
|
||||||
@@ -254,7 +266,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
#if MC_VER < MC_1_18_2
|
#if MC_VER < MC_1_18_2
|
||||||
expectedClassNames = new String[] { Biome.class.getName() };
|
expectedClassNames = new String[] { Biome.class.getName() };
|
||||||
#elif MC_VER <= MC_1_20_4
|
#elif MC_VER <= MC_1_20_6
|
||||||
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
|
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
|
||||||
#else
|
#else
|
||||||
// See preprocessor comment in createChunkWrapper() for full documentation
|
// See preprocessor comment in createChunkWrapper() for full documentation
|
||||||
@@ -275,7 +287,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if MC_VER <= MC_1_20_4
|
#if MC_VER <= MC_1_20_6
|
||||||
if (objectArray.length != 1)
|
if (objectArray.length != 1)
|
||||||
{
|
{
|
||||||
throw new ClassCastException(createBlockStateWrapperErrorMessage(objectArray));
|
throw new ClassCastException(createBlockStateWrapperErrorMessage(objectArray));
|
||||||
@@ -302,7 +314,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
expectedClassNames = new String[] { Biome.class.getName() };
|
expectedClassNames = new String[] { Biome.class.getName() };
|
||||||
#elif MC_VER <= MC_1_20_4
|
#elif MC_VER <= MC_1_20_6
|
||||||
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
|
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
|
||||||
#else
|
#else
|
||||||
// See preprocessor comment in createChunkWrapper() for full documentation
|
// See preprocessor comment in createChunkWrapper() for full documentation
|
||||||
|
|||||||
+91
-52
@@ -32,8 +32,6 @@ import org.apache.logging.log4j.Logger;
|
|||||||
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
|
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
|
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
|
||||||
@@ -56,16 +54,22 @@ import net.minecraft.world.level.biome.Biomes;
|
|||||||
/** This class wraps the minecraft BlockPos.Mutable (and BlockPos) class */
|
/** This class wraps the minecraft BlockPos.Mutable (and BlockPos) class */
|
||||||
public class BiomeWrapper implements IBiomeWrapper
|
public class BiomeWrapper implements IBiomeWrapper
|
||||||
{
|
{
|
||||||
|
// must be defined before AIR, otherwise a null pointer will be thrown
|
||||||
private static final Logger LOGGER = LogManager.getLogger();
|
private static final Logger LOGGER = LogManager.getLogger();
|
||||||
|
|
||||||
|
|
||||||
#if MC_VER < MC_1_18_2
|
#if MC_VER < MC_1_18_2
|
||||||
public static final ConcurrentMap<Biome, BiomeWrapper> WRAPPER_BY_BIOME = new ConcurrentHashMap<>();
|
public static final ConcurrentMap<Biome, BiomeWrapper> WRAPPER_BY_BIOME = new ConcurrentHashMap<>();
|
||||||
#else
|
#else
|
||||||
public static final ConcurrentMap<Holder<Biome>, BiomeWrapper> WRAPPER_BY_BIOME = new ConcurrentHashMap<>();
|
public static final ConcurrentMap<Holder<Biome>, BiomeWrapper> WRAPPER_BY_BIOME = new ConcurrentHashMap<>();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public static final String EMPTY_STRING = "EMPTY";
|
public static final ConcurrentHashMap<String, BiomeWrapper> WRAPPER_BY_RESOURCE_LOCATION = new ConcurrentHashMap<>();
|
||||||
public static final BiomeWrapper EMPTY_WRAPPER = new BiomeWrapper();
|
|
||||||
|
public static final String EMPTY_BIOME_STRING = "EMPTY";
|
||||||
|
public static final BiomeWrapper EMPTY_WRAPPER = new BiomeWrapper(null, null);
|
||||||
|
|
||||||
|
public static final String PLAINS_RESOURCE_LOCATION_STRING = "minecraft:plains";
|
||||||
|
|
||||||
/** keep track of broken biomes so we don't log every time */
|
/** keep track of broken biomes so we don't log every time */
|
||||||
private static final HashSet<String> brokenResourceLocationStrings = new HashSet<>();
|
private static final HashSet<String> brokenResourceLocationStrings = new HashSet<>();
|
||||||
@@ -88,7 +92,8 @@ public class BiomeWrapper implements IBiomeWrapper
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** technically final, but since it requires a method call to generate it can't be marked as such */
|
/** technically final, but since it requires a method call to generate it can't be marked as such */
|
||||||
private String serialString = null;
|
private String serialString;
|
||||||
|
private final int hashCode;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -119,14 +124,17 @@ public class BiomeWrapper implements IBiomeWrapper
|
|||||||
{
|
{
|
||||||
this.biome = biome;
|
this.biome = biome;
|
||||||
this.serialString = this.serialize(levelWrapper);
|
this.serialString = this.serialize(levelWrapper);
|
||||||
LOGGER.trace("Created BiomeWrapper ["+this.serialString+"] for ["+biome+"]");
|
this.hashCode = Objects.hash(this.serialString);
|
||||||
|
|
||||||
|
//LOGGER.trace("Created BiomeWrapper ["+this.serialString+"] for ["+biome+"]");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** should only be used to create {@link BiomeWrapper#EMPTY_WRAPPER} */
|
/** should only be used to create {@link BiomeWrapper#EMPTY_WRAPPER} */
|
||||||
private BiomeWrapper()
|
private BiomeWrapper()
|
||||||
{
|
{
|
||||||
this.biome = null;
|
this.biome = null;
|
||||||
this.serialString = EMPTY_STRING;
|
this.serialString = EMPTY_BIOME_STRING;
|
||||||
|
this.hashCode = Objects.hash(this.serialString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -140,7 +148,7 @@ public class BiomeWrapper implements IBiomeWrapper
|
|||||||
{
|
{
|
||||||
if (this == EMPTY_WRAPPER)
|
if (this == EMPTY_WRAPPER)
|
||||||
{
|
{
|
||||||
return EMPTY_STRING;
|
return EMPTY_BIOME_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MC_VER < MC_1_18_2
|
#if MC_VER < MC_1_18_2
|
||||||
@@ -168,7 +176,7 @@ public class BiomeWrapper implements IBiomeWrapper
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() { return Objects.hash(this.getSerialString()); }
|
public int hashCode() { return this.hashCode; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSerialString() { return this.serialString; }
|
public String getSerialString() { return this.serialString; }
|
||||||
@@ -187,29 +195,31 @@ public class BiomeWrapper implements IBiomeWrapper
|
|||||||
|
|
||||||
public String serialize(ILevelWrapper levelWrapper)
|
public String serialize(ILevelWrapper levelWrapper)
|
||||||
{
|
{
|
||||||
if (this.serialString != null)
|
if (this.biome == null)
|
||||||
{
|
{
|
||||||
return this.serialString;
|
return EMPTY_BIOME_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// we can't generate a serial string if the level is null
|
// we can't generate a serial string if the level is null
|
||||||
if (levelWrapper == null)
|
if (levelWrapper == null)
|
||||||
{
|
{
|
||||||
if (!emptyLevelSerializeFailLogged)
|
if (!emptyLevelSerializeFailLogged)
|
||||||
{
|
{
|
||||||
emptyLevelSerializeFailLogged = true;
|
emptyLevelSerializeFailLogged = true;
|
||||||
LOGGER.warn("Unable to serialize biome: ["+this.biome+"] because the passed in level wrapper is null. Future errors won't be logged.");
|
LOGGER.warn("Unable to serialize biome: [" + this.biome + "] because the passed in level wrapper is null. Future errors of this type won't be logged.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return EMPTY_STRING;
|
return EMPTY_BIOME_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// generate the serial string //
|
// generate the serial string //
|
||||||
|
|
||||||
net.minecraft.core.RegistryAccess registryAccess = Minecraft.getInstance().level.registryAccess();
|
Level level = (Level)levelWrapper.getWrappedMcObject();
|
||||||
|
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
|
||||||
|
|
||||||
ResourceLocation resourceLocation;
|
ResourceLocation resourceLocation;
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
@@ -241,14 +251,18 @@ public class BiomeWrapper implements IBiomeWrapper
|
|||||||
return this.serialString;
|
return this.serialString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO would it be worth while to cache these objects in a ConcurrentHashMap<string, IBiomeWrapper>?
|
||||||
public static IBiomeWrapper deserialize(String resourceLocationString, ILevelWrapper levelWrapper) throws IOException
|
public static IBiomeWrapper deserialize(String resourceLocationString, ILevelWrapper levelWrapper) throws IOException
|
||||||
{
|
{
|
||||||
if (resourceLocationString.equals(EMPTY_STRING))
|
// we need the final string for the concurrent hash map later
|
||||||
|
final String finalResourceStateString = resourceLocationString;
|
||||||
|
|
||||||
|
if (resourceLocationString.equals(EMPTY_BIOME_STRING))
|
||||||
{
|
{
|
||||||
if (!emptyStringWarningLogged)
|
if (!emptyStringWarningLogged)
|
||||||
{
|
{
|
||||||
emptyStringWarningLogged = true;
|
emptyStringWarningLogged = true;
|
||||||
LOGGER.warn("[" + EMPTY_STRING + "] biome string deserialized. This may mean the level was null when a save was attempted, a file saving error, or a biome saving error. Future errors will not be logged.");
|
LOGGER.warn("[" + EMPTY_BIOME_STRING + "] biome string deserialized. This may mean the level was null when a save was attempted, a file saving error, or a biome saving error. Future errors will not be logged.");
|
||||||
}
|
}
|
||||||
return EMPTY_WRAPPER;
|
return EMPTY_WRAPPER;
|
||||||
}
|
}
|
||||||
@@ -258,53 +272,78 @@ public class BiomeWrapper implements IBiomeWrapper
|
|||||||
return EMPTY_WRAPPER;
|
return EMPTY_WRAPPER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (WRAPPER_BY_RESOURCE_LOCATION.containsKey(finalResourceStateString))
|
||||||
|
|
||||||
// parse the resource location
|
|
||||||
int separatorIndex = resourceLocationString.indexOf(":");
|
|
||||||
if (separatorIndex == -1)
|
|
||||||
{
|
{
|
||||||
throw new IOException("Unable to parse resource location string: [" + resourceLocationString + "].");
|
return WRAPPER_BY_RESOURCE_LOCATION.get(finalResourceStateString);
|
||||||
}
|
}
|
||||||
ResourceLocation resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// if no wrapper is found, default to the empty wrapper
|
||||||
|
BiomeWrapper foundWrapper = EMPTY_WRAPPER;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Level level = (Level)levelWrapper.getWrappedMcObject();
|
// parse the resource location
|
||||||
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
|
int separatorIndex = resourceLocationString.indexOf(":");
|
||||||
|
if (separatorIndex == -1)
|
||||||
boolean success;
|
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
|
||||||
Biome biome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
|
|
||||||
success = (biome != null);
|
|
||||||
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
|
|
||||||
Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
|
|
||||||
success = (unwrappedBiome != null);
|
|
||||||
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
|
|
||||||
#else
|
|
||||||
Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation);
|
|
||||||
success = (unwrappedBiome != null);
|
|
||||||
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!success)
|
|
||||||
{
|
{
|
||||||
if (!brokenResourceLocationStrings.contains(resourceLocationString))
|
throw new IOException("Unable to parse resource location string: [" + resourceLocationString + "].");
|
||||||
{
|
|
||||||
brokenResourceLocationStrings.add(resourceLocationString);
|
|
||||||
LOGGER.warn("Unable to deserialize biome from string: [" + resourceLocationString + "]");
|
|
||||||
}
|
|
||||||
return EMPTY_WRAPPER;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return getBiomeWrapper(biome, levelWrapper);
|
ResourceLocation resourceLocation;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new IOException("No Resource Location found for the string: [" + resourceLocationString + "] Error: [" + e.getMessage() + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Level level = (Level) levelWrapper.getWrappedMcObject();
|
||||||
|
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
|
||||||
|
|
||||||
|
boolean success;
|
||||||
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
|
Biome biome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
|
||||||
|
success = (biome != null);
|
||||||
|
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
|
||||||
|
Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
|
||||||
|
success = (unwrappedBiome != null);
|
||||||
|
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
|
||||||
|
#else
|
||||||
|
Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation);
|
||||||
|
success = (unwrappedBiome != null);
|
||||||
|
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
if (!brokenResourceLocationStrings.contains(resourceLocationString))
|
||||||
|
{
|
||||||
|
brokenResourceLocationStrings.add(resourceLocationString);
|
||||||
|
LOGGER.warn("Unable to deserialize biome from string: [" + resourceLocationString + "]");
|
||||||
|
}
|
||||||
|
return EMPTY_WRAPPER;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
foundWrapper = (BiomeWrapper) getBiomeWrapper(biome, levelWrapper);
|
||||||
|
return foundWrapper;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new IOException("Failed to deserialize the string [" + finalResourceStateString + "] into a BiomeWrapper: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
finally
|
||||||
{
|
{
|
||||||
throw new IOException("Failed to deserialize the string [" + resourceLocationString + "] into a BiomeWrapper: " + e.getMessage(), e);
|
WRAPPER_BY_RESOURCE_LOCATION.putIfAbsent(finalResourceStateString, foundWrapper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+114
-73
@@ -65,10 +65,13 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
||||||
|
|
||||||
public static final ConcurrentHashMap<BlockState, BlockStateWrapper> WRAPPER_BY_BLOCK_STATE = new ConcurrentHashMap<>();
|
public static final ConcurrentHashMap<BlockState, BlockStateWrapper> WRAPPER_BY_BLOCK_STATE = new ConcurrentHashMap<>();
|
||||||
|
public static final ConcurrentHashMap<String, BlockStateWrapper> WRAPPER_BY_RESOURCE_LOCATION = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public static final String AIR_STRING = "AIR";
|
public static final String AIR_STRING = "AIR";
|
||||||
public static final BlockStateWrapper AIR = new BlockStateWrapper(null, null);
|
public static final BlockStateWrapper AIR = new BlockStateWrapper(null, null);
|
||||||
|
|
||||||
|
public static final String DIRT_RESOURCE_LOCATION_STRING = "minecraft:dirt";
|
||||||
|
|
||||||
// TODO: Make this changeable through the config
|
// TODO: Make this changeable through the config
|
||||||
public static final String[] RENDERER_IGNORED_BLOCKS_RESOURCE_LOCATIONS = { AIR_STRING, "minecraft:barrier", "minecraft:structure_void", "minecraft:light", "minecraft:tripwire" };
|
public static final String[] RENDERER_IGNORED_BLOCKS_RESOURCE_LOCATIONS = { AIR_STRING, "minecraft:barrier", "minecraft:structure_void", "minecraft:light", "minecraft:tripwire" };
|
||||||
public static HashSet<IBlockStateWrapper> rendererIgnoredBlocks = null;
|
public static HashSet<IBlockStateWrapper> rendererIgnoredBlocks = null;
|
||||||
@@ -83,6 +86,7 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
public final BlockState blockState;
|
public final BlockState blockState;
|
||||||
/** technically final, but since it requires a method call to generate it can't be marked as such */
|
/** technically final, but since it requires a method call to generate it can't be marked as such */
|
||||||
private String serialString;
|
private String serialString;
|
||||||
|
private final int hashCode;
|
||||||
/**
|
/**
|
||||||
* Cached opacity value, -1 if not populated. <br>
|
* Cached opacity value, -1 if not populated. <br>
|
||||||
* Should be between {@link IBlockStateWrapper#FULLY_OPAQUE} and {@link IBlockStateWrapper#FULLY_OPAQUE}
|
* Should be between {@link IBlockStateWrapper#FULLY_OPAQUE} and {@link IBlockStateWrapper#FULLY_OPAQUE}
|
||||||
@@ -121,8 +125,10 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
{
|
{
|
||||||
this.blockState = blockState;
|
this.blockState = blockState;
|
||||||
this.serialString = this.serialize(levelWrapper);
|
this.serialString = this.serialize(levelWrapper);
|
||||||
|
this.hashCode = Objects.hash(this.serialString);
|
||||||
this.irisBlockMaterialId = this.calculateIrisBlockMaterialId();
|
this.irisBlockMaterialId = this.calculateIrisBlockMaterialId();
|
||||||
LOGGER.trace("Created BlockStateWrapper ["+this.serialString+"] for ["+blockState+"] with material ID ["+this.irisBlockMaterialId+"]");
|
|
||||||
|
//LOGGER.trace("Created BlockStateWrapper ["+this.serialString+"] for ["+blockState+"] with material ID ["+this.irisBlockMaterialId+"]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -245,7 +251,7 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() { return Objects.hash(this.getSerialString()); }
|
public int hashCode() { return this.hashCode; }
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -334,103 +340,135 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
/** will only work if a level is currently loaded */
|
/** will only work if a level is currently loaded */
|
||||||
public static IBlockStateWrapper deserialize(String resourceStateString, ILevelWrapper levelWrapper) throws IOException
|
public static IBlockStateWrapper deserialize(String resourceStateString, ILevelWrapper levelWrapper) throws IOException
|
||||||
{
|
{
|
||||||
if (resourceStateString.equals(AIR_STRING) || resourceStateString.equals("")) // the empty string shouldn't normally happen, but just in case
|
// we need the final string for the concurrent hash map later
|
||||||
|
final String finalResourceStateString = resourceStateString;
|
||||||
|
|
||||||
|
if (finalResourceStateString.equals(AIR_STRING) || finalResourceStateString.equals("")) // the empty string shouldn't normally happen, but just in case
|
||||||
{
|
{
|
||||||
return AIR;
|
return AIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// attempt to use the existing wrapper
|
||||||
|
if (WRAPPER_BY_RESOURCE_LOCATION.containsKey(finalResourceStateString))
|
||||||
// try to parse out the BlockState
|
|
||||||
String blockStatePropertiesString = null; // will be null if no properties were included
|
|
||||||
int stateSeparatorIndex = resourceStateString.indexOf(STATE_STRING_SEPARATOR);
|
|
||||||
if (stateSeparatorIndex != -1)
|
|
||||||
{
|
{
|
||||||
// blockstate properties found
|
return WRAPPER_BY_RESOURCE_LOCATION.get(finalResourceStateString);
|
||||||
blockStatePropertiesString = resourceStateString.substring(stateSeparatorIndex + STATE_STRING_SEPARATOR.length());
|
|
||||||
resourceStateString = resourceStateString.substring(0, stateSeparatorIndex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse the resource location
|
|
||||||
int resourceSeparatorIndex = resourceStateString.indexOf(RESOURCE_LOCATION_SEPARATOR);
|
|
||||||
if (resourceSeparatorIndex == -1)
|
|
||||||
{
|
|
||||||
throw new IOException("Unable to parse Resource Location out of string: [" + resourceStateString + "].");
|
|
||||||
}
|
|
||||||
ResourceLocation resourceLocation = new ResourceLocation(resourceStateString.substring(0, resourceSeparatorIndex), resourceStateString.substring(resourceSeparatorIndex + 1));
|
|
||||||
|
|
||||||
|
|
||||||
|
// if no wrapper is found, default to air
|
||||||
// attempt to get the BlockState from all possible BlockStates
|
BlockStateWrapper foundWrapper = AIR;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// try to parse out the BlockState
|
||||||
#if MC_VER > MC_1_17_1
|
String blockStatePropertiesString = null; // will be null if no properties were included
|
||||||
// use the given level if possible, otherwise try using the currently loaded one
|
int stateSeparatorIndex = resourceStateString.indexOf(STATE_STRING_SEPARATOR);
|
||||||
Level level = (levelWrapper != null ? (Level)levelWrapper.getWrappedMcObject() : null);
|
if (stateSeparatorIndex != -1)
|
||||||
level = (level == null ? Minecraft.getInstance().level : level);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Block block;
|
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
|
||||||
block = Registry.BLOCK.get(resourceLocation);
|
|
||||||
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
|
|
||||||
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
|
|
||||||
block = registryAccess.registryOrThrow(Registry.BLOCK_REGISTRY).get(resourceLocation);
|
|
||||||
#else
|
|
||||||
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
|
|
||||||
block = registryAccess.registryOrThrow(Registries.BLOCK).get(resourceLocation);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
if (block == null)
|
|
||||||
{
|
{
|
||||||
// shouldn't normally happen, but here to make the compiler happy
|
// blockstate properties found
|
||||||
if (!BrokenResourceLocations.contains(resourceLocation))
|
blockStatePropertiesString = resourceStateString.substring(stateSeparatorIndex + STATE_STRING_SEPARATOR.length());
|
||||||
{
|
resourceStateString = resourceStateString.substring(0, stateSeparatorIndex);
|
||||||
BrokenResourceLocations.add(resourceLocation);
|
}
|
||||||
LOGGER.warn("Unable to find BlockState with the resourceLocation [" + resourceLocation + "] and properties: [" + blockStatePropertiesString + "]. Air will be used instead, some data may be lost.");
|
|
||||||
}
|
// parse the resource location
|
||||||
return AIR;
|
int separatorIndex = resourceStateString.indexOf(RESOURCE_LOCATION_SEPARATOR);
|
||||||
|
if (separatorIndex == -1)
|
||||||
|
{
|
||||||
|
throw new IOException("Unable to parse Resource Location out of string: [" + resourceStateString + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceLocation resourceLocation;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
resourceLocation = new ResourceLocation(resourceStateString.substring(0, separatorIndex), resourceStateString.substring(separatorIndex + 1));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new IOException("No Resource Location found for the string: [" + resourceStateString + "] Error: [" + e.getMessage() + "].");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// attempt to find the blockstate from all possibilities
|
|
||||||
BlockState foundState = null;
|
|
||||||
if (blockStatePropertiesString != null)
|
|
||||||
{
|
|
||||||
List<BlockState> possibleStateList = block.getStateDefinition().getPossibleStates();
|
|
||||||
for (BlockState possibleState : possibleStateList)
|
|
||||||
{
|
|
||||||
String possibleStatePropertiesString = serializeBlockStateProperties(possibleState);
|
|
||||||
if (possibleStatePropertiesString.equals(blockStatePropertiesString))
|
|
||||||
{
|
|
||||||
foundState = possibleState;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// use the default if no state was found or given
|
// attempt to get the BlockState from all possible BlockStates
|
||||||
if (foundState == null)
|
try
|
||||||
{
|
{
|
||||||
if (blockStatePropertiesString != null)
|
|
||||||
|
#if MC_VER > MC_1_17_1
|
||||||
|
// use the given level if possible, otherwise try using the currently loaded one
|
||||||
|
Level level = (levelWrapper != null ? (Level) levelWrapper.getWrappedMcObject() : null);
|
||||||
|
level = (level == null ? Minecraft.getInstance().level : level);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Block block;
|
||||||
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
|
block = Registry.BLOCK.get(resourceLocation);
|
||||||
|
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
|
||||||
|
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
|
||||||
|
block = registryAccess.registryOrThrow(Registry.BLOCK_REGISTRY).get(resourceLocation);
|
||||||
|
#else
|
||||||
|
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
|
||||||
|
block = registryAccess.registryOrThrow(Registries.BLOCK).get(resourceLocation);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (block == null)
|
||||||
{
|
{
|
||||||
// we should have found a blockstate, but didn't
|
// shouldn't normally happen, but here to make the compiler happy
|
||||||
if (!BrokenResourceLocations.contains(resourceLocation))
|
if (!BrokenResourceLocations.contains(resourceLocation))
|
||||||
{
|
{
|
||||||
BrokenResourceLocations.add(resourceLocation);
|
BrokenResourceLocations.add(resourceLocation);
|
||||||
LOGGER.warn("Unable to find BlockState for Block [" + resourceLocation + "] with properties: [" + blockStatePropertiesString + "]. Using the default block state.");
|
LOGGER.warn("Unable to find BlockState with the resourceLocation [" + resourceLocation + "] and properties: [" + blockStatePropertiesString + "]. Air will be used instead, some data may be lost.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return AIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// attempt to find the blockstate from all possibilities
|
||||||
|
BlockState foundState = null;
|
||||||
|
if (blockStatePropertiesString != null)
|
||||||
|
{
|
||||||
|
List<BlockState> possibleStateList = block.getStateDefinition().getPossibleStates();
|
||||||
|
for (BlockState possibleState : possibleStateList)
|
||||||
|
{
|
||||||
|
String possibleStatePropertiesString = serializeBlockStateProperties(possibleState);
|
||||||
|
if (possibleStatePropertiesString.equals(blockStatePropertiesString))
|
||||||
|
{
|
||||||
|
foundState = possibleState;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foundState = block.defaultBlockState();
|
// use the default if no state was found or given
|
||||||
|
if (foundState == null)
|
||||||
|
{
|
||||||
|
if (blockStatePropertiesString != null)
|
||||||
|
{
|
||||||
|
// we should have found a blockstate, but didn't
|
||||||
|
if (!BrokenResourceLocations.contains(resourceLocation))
|
||||||
|
{
|
||||||
|
BrokenResourceLocations.add(resourceLocation);
|
||||||
|
LOGGER.warn("Unable to find BlockState for Block [" + resourceLocation + "] with properties: [" + blockStatePropertiesString + "]. Using the default block state.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foundState = block.defaultBlockState();
|
||||||
|
}
|
||||||
|
|
||||||
|
foundWrapper = new BlockStateWrapper(foundState, levelWrapper);
|
||||||
|
return foundWrapper;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new IOException("Failed to deserialize the string [" + finalResourceStateString + "] into a BlockStateWrapper: " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
return new BlockStateWrapper(foundState, levelWrapper);
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
finally
|
||||||
{
|
{
|
||||||
throw new IOException("Failed to deserialize the string [" + resourceStateString + "] into a BlockStateWrapper: " + e.getMessage(), e);
|
// put if absent in case two threads deserialize at the same time
|
||||||
|
// unfortunately we can't put everything in a computeIfAbsent() since we also throw exceptions
|
||||||
|
WRAPPER_BY_RESOURCE_LOCATION.putIfAbsent(finalResourceStateString, foundWrapper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -518,9 +556,12 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
{
|
{
|
||||||
return IrisBlockMaterial.METAL;
|
return IrisBlockMaterial.METAL;
|
||||||
}
|
}
|
||||||
|
else if (serialString.contains("grass_block"))
|
||||||
|
{
|
||||||
|
return IrisBlockMaterial.GRASS;
|
||||||
|
}
|
||||||
else if (
|
else if (
|
||||||
serialString.contains("dirt")
|
serialString.contains("dirt")
|
||||||
|| serialString.contains("grass_block")
|
|
||||||
|| serialString.contains("gravel")
|
|| serialString.contains("gravel")
|
||||||
|| serialString.contains("mud")
|
|| serialString.contains("mud")
|
||||||
|| serialString.contains("podzol")
|
|| serialString.contains("podzol")
|
||||||
|
|||||||
+59
-11
@@ -19,14 +19,20 @@
|
|||||||
|
|
||||||
package com.seibel.distanthorizons.common.wrappers.block;
|
package com.seibel.distanthorizons.common.wrappers.block;
|
||||||
|
|
||||||
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
|
import com.seibel.distanthorizons.core.util.ColorUtil;
|
||||||
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.world.level.*;
|
import net.minecraft.world.level.*;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import net.minecraft.world.level.biome.Biomes;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.lighting.LevelLightEngine;
|
import net.minecraft.world.level.lighting.LevelLightEngine;
|
||||||
import net.minecraft.world.level.material.FluidState;
|
import net.minecraft.world.level.material.FluidState;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
#if MC_VER >= MC_1_18_2
|
#if MC_VER >= MC_1_18_2
|
||||||
@@ -35,18 +41,54 @@ import net.minecraft.core.Holder;
|
|||||||
|
|
||||||
public class TintWithoutLevelOverrider implements BlockAndTintGetter
|
public class TintWithoutLevelOverrider implements BlockAndTintGetter
|
||||||
{
|
{
|
||||||
final BiomeWrapper biome;
|
/**
|
||||||
|
* This will only ever be null if there was an issue with {@link IClientLevelWrapper#getPlainsBiomeWrapper()}
|
||||||
|
* but {@link Nullable} is there just in case.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private final Biome biome;
|
||||||
|
|
||||||
public TintWithoutLevelOverrider(BiomeWrapper biome)
|
|
||||||
|
|
||||||
|
public TintWithoutLevelOverrider(BiomeWrapper biomeWrapper, IClientLevelWrapper clientLevelWrapper)
|
||||||
{
|
{
|
||||||
this.biome = biome;
|
// try to get the wrapped biome
|
||||||
|
Biome unwrappedBiome = null;
|
||||||
|
if (biomeWrapper.biome != null)
|
||||||
|
{
|
||||||
|
unwrappedBiome = unwrap(biomeWrapper.biome);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(unwrappedBiome == null)
|
||||||
|
{
|
||||||
|
// we are looking at the empty biome wrapper, try using plains as a backup
|
||||||
|
BiomeWrapper plainsBiomeWrapper = ((BiomeWrapper) clientLevelWrapper.getPlainsBiomeWrapper());
|
||||||
|
if (plainsBiomeWrapper != null)
|
||||||
|
{
|
||||||
|
unwrappedBiome = unwrap(plainsBiomeWrapper.biome);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.biome = unwrappedBiome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver)
|
public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver)
|
||||||
{
|
{
|
||||||
return colorResolver.getColor(_unwrap(biome.biome), blockPos.getX(), blockPos.getZ());
|
if (this.biome != null)
|
||||||
|
{
|
||||||
|
return colorResolver.getColor(this.biome, blockPos.getX(), blockPos.getZ());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// hopefully unneeded debug color
|
||||||
|
return ColorUtil.CYAN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
private Biome _unwrap(#if MC_VER >= MC_1_18_2 Holder<Biome> #else Biome #endif biome)
|
|
||||||
|
private static Biome unwrap(#if MC_VER >= MC_1_18_2 Holder<Biome> #else Biome #endif biome)
|
||||||
{
|
{
|
||||||
#if MC_VER >= MC_1_18_2
|
#if MC_VER >= MC_1_18_2
|
||||||
return biome.value();
|
return biome.value();
|
||||||
@@ -55,30 +97,36 @@ public class TintWithoutLevelOverrider implements BlockAndTintGetter
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//================//
|
||||||
|
// unused methods //
|
||||||
|
//================//
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getShade(Direction direction, boolean shade)
|
public float getShade(@NotNull Direction direction, boolean shade)
|
||||||
{
|
{
|
||||||
throw new UnsupportedOperationException("ERROR: getShade() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
throw new UnsupportedOperationException("ERROR: getShade() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public LevelLightEngine getLightEngine()
|
public @NotNull LevelLightEngine getLightEngine()
|
||||||
{
|
{
|
||||||
throw new UnsupportedOperationException("ERROR: getLightEngine() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
throw new UnsupportedOperationException("ERROR: getLightEngine() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
||||||
}
|
}
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public BlockEntity getBlockEntity(BlockPos pos)
|
public BlockEntity getBlockEntity(@NotNull BlockPos pos)
|
||||||
{
|
{
|
||||||
throw new UnsupportedOperationException("ERROR: getBlockEntity() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
throw new UnsupportedOperationException("ERROR: getBlockEntity() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getBlockState(BlockPos pos)
|
public @NotNull BlockState getBlockState(@NotNull BlockPos pos)
|
||||||
{
|
{
|
||||||
throw new UnsupportedOperationException("ERROR: getBlockState() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
throw new UnsupportedOperationException("ERROR: getBlockState() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public FluidState getFluidState(BlockPos pos)
|
public @NotNull FluidState getFluidState(@NotNull BlockPos pos)
|
||||||
{
|
{
|
||||||
throw new UnsupportedOperationException("ERROR: getFluidState() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
throw new UnsupportedOperationException("ERROR: getFluidState() called on TintWithoutLevelOverrider. Object is for tinting only.");
|
||||||
}
|
}
|
||||||
|
|||||||
+133
-37
@@ -54,7 +54,6 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class ClientBlockStateCache
|
public class ClientBlockStateCache
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
||||||
|
|
||||||
private static final HashSet<BlockState> BLOCK_STATES_THAT_NEED_LEVEL = new HashSet<>();
|
private static final HashSet<BlockState> BLOCK_STATES_THAT_NEED_LEVEL = new HashSet<>();
|
||||||
@@ -66,15 +65,20 @@ public class ClientBlockStateCache
|
|||||||
public static final RandomSource random = RandomSource.create();
|
public static final RandomSource random = RandomSource.create();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
public final IClientLevelWrapper levelWrapper;
|
||||||
public final BlockState blockState;
|
public final BlockState blockState;
|
||||||
public final LevelReader level;
|
public final LevelReader level;
|
||||||
public final BlockPos pos;
|
public final BlockPos pos;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public ClientBlockStateCache(BlockState blockState, IClientLevelWrapper samplingLevel, DhBlockPos samplingPos)
|
public ClientBlockStateCache(BlockState blockState, IClientLevelWrapper samplingLevel, DhBlockPos samplingPos)
|
||||||
{
|
{
|
||||||
this.blockState = blockState;
|
this.blockState = blockState;
|
||||||
level = (LevelReader) samplingLevel.getWrappedMcObject();
|
this.levelWrapper = samplingLevel;
|
||||||
pos = McObjectConverter.Convert(samplingPos);
|
this.level = (LevelReader) samplingLevel.getWrappedMcObject();
|
||||||
resolveColors();
|
this.pos = McObjectConverter.Convert(samplingPos);
|
||||||
|
this.resolveColors();
|
||||||
//LOGGER.info("ClientBlocKCache created for {}", blockState);
|
//LOGGER.info("ClientBlocKCache created for {}", blockState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,16 +96,94 @@ public class ClientBlockStateCache
|
|||||||
Default,
|
Default,
|
||||||
Flower,
|
Flower,
|
||||||
Leaves,
|
Leaves,
|
||||||
Chisel;
|
Chisel,
|
||||||
|
Glass;
|
||||||
static ColorMode getColorMode(Block b)
|
static ColorMode getColorMode(Block b)
|
||||||
{
|
{
|
||||||
if (b instanceof LeavesBlock) return Leaves;
|
if (b instanceof LeavesBlock) return Leaves;
|
||||||
if (b instanceof FlowerBlock) return Flower;
|
if (b instanceof FlowerBlock) return Flower;
|
||||||
|
if (b.toString().contains("glass")) return Glass;
|
||||||
if (b.toString().equals("Block{chiselsandbits:chiseled}")) return Chisel;
|
if (b.toString().equals("Block{chiselsandbits:chiseled}")) return Chisel;
|
||||||
return Default;
|
return Default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Way to efficiently do this was suggested by IMS from sodium. This is where those numbers and support code was lifted from.
|
||||||
|
private static final int MIN_BITS = 0x39000000; // 2^(-13)
|
||||||
|
private static final int MAX_BITS = 0x3f7fffff; // 1.0 - f32::EPSILON
|
||||||
|
private static final float MIN_BOUND = Float.intBitsToFloat(MIN_BITS);
|
||||||
|
private static final float MAX_BOUND = Float.intBitsToFloat(MAX_BITS);
|
||||||
|
|
||||||
|
private static final int[] linearToSrgbTable = new int[] {
|
||||||
|
0x0073000d, 0x007a000d, 0x0080000d, 0x0087000d, 0x008d000d, 0x0094000d, 0x009a000d, 0x00a1000d,
|
||||||
|
0x00a7001a, 0x00b4001a, 0x00c1001a, 0x00ce001a, 0x00da001a, 0x00e7001a, 0x00f4001a, 0x0101001a,
|
||||||
|
0x010e0033, 0x01280033, 0x01410033, 0x015b0033, 0x01750033, 0x018f0033, 0x01a80033, 0x01c20033,
|
||||||
|
0x01dc0067, 0x020f0067, 0x02430067, 0x02760067, 0x02aa0067, 0x02dd0067, 0x03110067, 0x03440067,
|
||||||
|
0x037800ce, 0x03df00ce, 0x044600ce, 0x04ad00ce, 0x051400ce, 0x057b00c5, 0x05dd00bc, 0x063b00b5,
|
||||||
|
0x06970158, 0x07420142, 0x07e30130, 0x087b0120, 0x090b0112, 0x09940106, 0x0a1700fc, 0x0a9500f2,
|
||||||
|
0x0b0f01cb, 0x0bf401ae, 0x0ccb0195, 0x0d950180, 0x0e56016e, 0x0f0d015e, 0x0fbc0150, 0x10630143,
|
||||||
|
0x11070264, 0x1238023e, 0x1357021d, 0x14660201, 0x156601e9, 0x165a01d3, 0x174401c0, 0x182401af,
|
||||||
|
0x18fe0331, 0x1a9602fe, 0x1c1502d2, 0x1d7e02ad, 0x1ed4028d, 0x201a0270, 0x21520256, 0x227d0240,
|
||||||
|
0x239f0443, 0x25c003fe, 0x27bf03c4, 0x29a10392, 0x2b6a0367, 0x2d1d0341, 0x2ebe031f, 0x304d0300,
|
||||||
|
0x31d105b0, 0x34a80555, 0x37520507, 0x39d504c5, 0x3c37048b, 0x3e7c0458, 0x40a8042a, 0x42bd0401,
|
||||||
|
0x44c20798, 0x488e071e, 0x4c1c06b6, 0x4f76065d, 0x52a50610, 0x55ac05cc, 0x5892058f, 0x5b590559,
|
||||||
|
0x5e0c0a23, 0x631c0980, 0x67db08f6, 0x6c55087f, 0x70940818, 0x74a007bd, 0x787d076c, 0x7c330723,
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final float[] srgbToLinearTable = new float[] {
|
||||||
|
0.0f, 0.000303527f, 0.000607054f, 0.00091058103f, 0.001214108f, 0.001517635f, 0.0018211621f, 0.002124689f,
|
||||||
|
0.002428216f, 0.002731743f, 0.00303527f, 0.0033465356f, 0.003676507f, 0.004024717f, 0.004391442f,
|
||||||
|
0.0047769533f, 0.005181517f, 0.0056053917f, 0.0060488326f, 0.006512091f, 0.00699541f, 0.0074990317f,
|
||||||
|
0.008023192f, 0.008568125f, 0.009134057f, 0.009721218f, 0.010329823f, 0.010960094f, 0.011612245f,
|
||||||
|
0.012286487f, 0.012983031f, 0.013702081f, 0.014443844f, 0.015208514f, 0.015996292f, 0.016807375f,
|
||||||
|
0.017641952f, 0.018500218f, 0.019382361f, 0.020288562f, 0.02121901f, 0.022173883f, 0.023153365f,
|
||||||
|
0.02415763f, 0.025186857f, 0.026241222f, 0.027320892f, 0.028426038f, 0.029556843f, 0.03071345f, 0.03189604f,
|
||||||
|
0.033104774f, 0.03433981f, 0.035601325f, 0.036889452f, 0.038204376f, 0.039546248f, 0.04091521f, 0.042311423f,
|
||||||
|
0.043735042f, 0.045186214f, 0.046665095f, 0.048171833f, 0.049706575f, 0.051269468f, 0.052860655f, 0.05448028f,
|
||||||
|
0.056128494f, 0.057805434f, 0.05951124f, 0.06124607f, 0.06301003f, 0.06480328f, 0.06662595f, 0.06847818f,
|
||||||
|
0.07036011f, 0.07227186f, 0.07421358f, 0.07618539f, 0.07818743f, 0.08021983f, 0.082282715f, 0.084376216f,
|
||||||
|
0.086500466f, 0.088655606f, 0.09084173f, 0.09305898f, 0.095307484f, 0.09758736f, 0.09989874f, 0.10224175f,
|
||||||
|
0.10461649f, 0.10702311f, 0.10946172f, 0.111932434f, 0.11443538f, 0.116970696f, 0.11953845f, 0.12213881f,
|
||||||
|
0.12477186f, 0.12743773f, 0.13013652f, 0.13286836f, 0.13563336f, 0.13843165f, 0.14126332f, 0.1441285f,
|
||||||
|
0.1470273f, 0.14995982f, 0.15292618f, 0.1559265f, 0.15896086f, 0.16202943f, 0.16513224f, 0.16826946f,
|
||||||
|
0.17144115f, 0.17464745f, 0.17788847f, 0.1811643f, 0.18447503f, 0.1878208f, 0.19120172f, 0.19461787f,
|
||||||
|
0.19806935f, 0.2015563f, 0.20507877f, 0.2086369f, 0.21223079f, 0.21586053f, 0.21952623f, 0.22322798f,
|
||||||
|
0.22696589f, 0.23074007f, 0.23455065f, 0.23839766f, 0.2422812f, 0.2462014f, 0.25015837f, 0.25415218f,
|
||||||
|
0.2581829f, 0.26225072f, 0.26635566f, 0.27049786f, 0.27467737f, 0.27889434f, 0.2831488f, 0.2874409f,
|
||||||
|
0.2917707f, 0.29613832f, 0.30054384f, 0.30498737f, 0.30946895f, 0.31398875f, 0.31854683f, 0.32314324f,
|
||||||
|
0.32777813f, 0.33245158f, 0.33716366f, 0.34191445f, 0.3467041f, 0.3515327f, 0.35640025f, 0.36130688f,
|
||||||
|
0.3662527f, 0.37123778f, 0.37626222f, 0.3813261f, 0.38642952f, 0.39157256f, 0.3967553f, 0.40197787f,
|
||||||
|
0.4072403f, 0.4125427f, 0.41788515f, 0.42326775f, 0.42869055f, 0.4341537f, 0.43965724f, 0.44520125f,
|
||||||
|
0.45078585f, 0.45641106f, 0.46207705f, 0.46778384f, 0.47353154f, 0.47932023f, 0.48514998f, 0.4910209f,
|
||||||
|
0.49693304f, 0.5028866f, 0.50888145f, 0.5149178f, 0.5209957f, 0.52711535f, 0.5332766f, 0.5394797f,
|
||||||
|
0.5457247f, 0.5520116f, 0.5583406f, 0.5647117f, 0.57112503f, 0.57758063f, 0.5840786f, 0.590619f, 0.597202f,
|
||||||
|
0.60382754f, 0.61049575f, 0.61720675f, 0.62396055f, 0.63075733f, 0.637597f, 0.6444799f, 0.6514058f,
|
||||||
|
0.65837497f, 0.66538745f, 0.67244333f, 0.6795426f, 0.68668544f, 0.69387203f, 0.70110214f, 0.70837605f,
|
||||||
|
0.7156938f, 0.72305536f, 0.730461f, 0.7379107f, 0.7454045f, 0.75294244f, 0.76052475f, 0.7681514f, 0.77582246f,
|
||||||
|
0.78353804f, 0.79129815f, 0.79910296f, 0.8069525f, 0.8148468f, 0.822786f, 0.8307701f, 0.83879924f, 0.84687346f,
|
||||||
|
0.8549928f, 0.8631574f, 0.87136734f, 0.8796226f, 0.8879232f, 0.89626956f, 0.90466136f, 0.913099f, 0.92158204f,
|
||||||
|
0.93011117f, 0.9386859f, 0.9473069f, 0.9559735f, 0.9646866f, 0.9734455f, 0.98225087f, 0.9911022f, 1.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
private static int linearToSrgb(float c) {
|
||||||
|
if (!(c > MIN_BOUND)) {
|
||||||
|
c = MIN_BOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c > MAX_BOUND) {
|
||||||
|
c = MAX_BOUND;
|
||||||
|
}
|
||||||
|
int inputBits = Float.floatToRawIntBits(c);
|
||||||
|
int entry = linearToSrgbTable[((inputBits - MIN_BITS) >> 20)];
|
||||||
|
|
||||||
|
int bias = (entry >>> 16) << 9;
|
||||||
|
int scale = entry & 0xffff;
|
||||||
|
int t = (inputBits >>> 12) & 0xff;
|
||||||
|
|
||||||
|
return (bias + (scale * t)) >>> 16;
|
||||||
|
}
|
||||||
|
//////////////
|
||||||
|
|
||||||
private static int getWidth(TextureAtlasSprite texture)
|
private static int getWidth(TextureAtlasSprite texture)
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_19_4
|
#if MC_VER < MC_1_19_4
|
||||||
@@ -120,20 +202,23 @@ public class ClientBlockStateCache
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//TODO: Perhaps make this not just use the first frame?
|
//TODO: Perhaps make this not just use the first frame?
|
||||||
private static int calculateColorFromTexture(TextureAtlasSprite texture, ColorMode colorMode)
|
private static int calculateColorFromTexture(TextureAtlasSprite texture, ColorMode colorMode)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
double alpha = 0;
|
int alpha = 0;
|
||||||
double red = 0;
|
double red = 0;
|
||||||
double green = 0;
|
double green = 0;
|
||||||
double blue = 0;
|
double blue = 0;
|
||||||
int tempColor;
|
int tempColor;
|
||||||
|
//make Chiseled block not render. Since ColorMode is set per block, you only need to check it once
|
||||||
|
if (colorMode != ColorMode.Chisel)
|
||||||
{
|
{
|
||||||
// textures normally use u and v instead of x and y
|
// textures normally use u and v instead of x and y
|
||||||
for (int u = 0; u < getWidth(texture); u++)
|
for (int v = 0; v < getHeight(texture); v++)
|
||||||
{
|
{
|
||||||
for (int v = 0; v < getHeight(texture); v++)
|
for (int u = 0; u < getWidth(texture); u++)
|
||||||
{
|
{
|
||||||
//note: Minecraft color format is: 0xAA BB GG RR
|
//note: Minecraft color format is: 0xAA BB GG RR
|
||||||
//________ DH mod color format is: 0xAA RR GG BB
|
//________ DH mod color format is: 0xAA RR GG BB
|
||||||
@@ -141,40 +226,45 @@ public class ClientBlockStateCache
|
|||||||
//_ OpenGL RGBA format Java Order: 0xAA BB GG RR
|
//_ OpenGL RGBA format Java Order: 0xAA BB GG RR
|
||||||
tempColor = TextureAtlasSpriteWrapper.getPixelRGBA(texture, 0, u, v);
|
tempColor = TextureAtlasSpriteWrapper.getPixelRGBA(texture, 0, u, v);
|
||||||
|
|
||||||
double r = ((tempColor & 0x000000FF)) / 255.;
|
int r = (tempColor & 0x000000FF);
|
||||||
double g = ((tempColor & 0x0000FF00) >>> 8) / 255.;
|
int g = (tempColor & 0x0000FF00) >>> 8;
|
||||||
double b = ((tempColor & 0x00FF0000) >>> 16) / 255.;
|
int b = (tempColor & 0x00FF0000) >>> 16;
|
||||||
double a = ((tempColor & 0xFF000000) >>> 24) / 255.;
|
int a = (tempColor & 0xFF000000) >>> 24;
|
||||||
int scale = 1;
|
int scale = 1;
|
||||||
|
|
||||||
if (colorMode == ColorMode.Leaves)
|
if (colorMode == ColorMode.Leaves)
|
||||||
{
|
{
|
||||||
r *= a;
|
//switch (//FIXME add config option)
|
||||||
g *= a;
|
// case BLACK:
|
||||||
b *= a;
|
// a = 255; //simulate black background of fast leaves
|
||||||
a = 1.;
|
// break;
|
||||||
|
// case IGNORE:
|
||||||
|
if (a == 0) {
|
||||||
|
continue; //same long grass
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
a = 255; //just in case there are semi transparent pixels
|
||||||
|
}
|
||||||
|
// break;
|
||||||
|
// case TRANSPARENT:
|
||||||
|
// break; //do nothing, let it count towards transparency
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (a == 0.)
|
else if (a == 0 && colorMode != ColorMode.Glass)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (colorMode == ColorMode.Flower && (g + 0.1 < b || g + 0.1 < r))
|
else if (colorMode == ColorMode.Flower && (g + 25 < b || g + 25 < r))
|
||||||
{
|
{
|
||||||
scale = FLOWER_COLOR_SCALE;
|
scale = FLOWER_COLOR_SCALE;
|
||||||
}
|
}
|
||||||
//make Chiseled block not render
|
|
||||||
else if (colorMode == ColorMode.Chisel)
|
|
||||||
{
|
|
||||||
r = 0;
|
|
||||||
g = 0;
|
|
||||||
b = 0;
|
|
||||||
a = 0;
|
|
||||||
}
|
|
||||||
count += scale;
|
count += scale;
|
||||||
alpha += a * a * scale;
|
//apparently alpha is linear
|
||||||
red += r * r * scale;
|
alpha += a * scale;
|
||||||
green += g * g * scale;
|
//gamma correction is complicated
|
||||||
blue += b * b * scale;
|
red += srgbToLinearTable[r] * a * scale;
|
||||||
|
green += srgbToLinearTable[g] * a * scale;
|
||||||
|
blue += srgbToLinearTable[b] * a * scale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -186,10 +276,16 @@ public class ClientBlockStateCache
|
|||||||
{
|
{
|
||||||
// determine the average color
|
// determine the average color
|
||||||
tempColor = ColorUtil.rgbToInt(
|
tempColor = ColorUtil.rgbToInt(
|
||||||
(int) (Math.sqrt(alpha / count) * 255.),
|
alpha / count,
|
||||||
(int) (Math.sqrt(red / count) * 255.),
|
linearToSrgb((float) (red / (double) alpha)),
|
||||||
(int) (Math.sqrt(green / count) * 255.),
|
linearToSrgb((float) (green / (double) alpha)),
|
||||||
(int) (Math.sqrt(blue / count) * 255.));
|
linearToSrgb((float) (blue / (double) alpha)));
|
||||||
|
}
|
||||||
|
//check if not missing texture
|
||||||
|
if (tempColor == ColorUtil.rgbToInt(255, 182, 0, 182))
|
||||||
|
{
|
||||||
|
//make it not render at all
|
||||||
|
tempColor = ColorUtil.rgbToInt(0, 255, 255, 255);
|
||||||
}
|
}
|
||||||
return tempColor;
|
return tempColor;
|
||||||
}
|
}
|
||||||
@@ -204,7 +300,7 @@ public class ClientBlockStateCache
|
|||||||
for (Direction direction : DIRECTION_ORDER)
|
for (Direction direction : DIRECTION_ORDER)
|
||||||
{
|
{
|
||||||
quads = Minecraft.getInstance().getModelManager().getBlockModelShaper().
|
quads = Minecraft.getInstance().getModelManager().getBlockModelShaper().
|
||||||
getBlockModel(blockState).getQuads(blockState, direction, random);
|
getBlockModel(blockState).getQuads(blockState, direction, random); // TODO getQuads sometimes throws a "makeThreadingException", is there anything we can do about that? Note: this isn't a critical issue, it just prints an ugly error and the render data will need to be regenered.
|
||||||
if (quads != null && !quads.isEmpty() &&
|
if (quads != null && !quads.isEmpty() &&
|
||||||
!(blockState.getBlock() instanceof RotatedPillarBlock && direction == Direction.UP))
|
!(blockState.getBlock() instanceof RotatedPillarBlock && direction == Direction.UP))
|
||||||
break;
|
break;
|
||||||
@@ -271,7 +367,7 @@ public class ClientBlockStateCache
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
tintColor = Minecraft.getInstance().getBlockColors()
|
tintColor = Minecraft.getInstance().getBlockColors()
|
||||||
.getColor(this.blockState, new TintWithoutLevelOverrider(biome), McObjectConverter.Convert(pos), this.tintIndex);
|
.getColor(this.blockState, new TintWithoutLevelOverrider(biome, this.levelWrapper), McObjectConverter.Convert(pos), this.tintIndex);
|
||||||
}
|
}
|
||||||
catch (UnsupportedOperationException e)
|
catch (UnsupportedOperationException e)
|
||||||
{
|
{
|
||||||
|
|||||||
+27
-4
@@ -42,27 +42,50 @@ public class ChunkLightStorage
|
|||||||
/** the data stored in this storage, split up into 16x16x16 areas. */
|
/** the data stored in this storage, split up into 16x16x16 areas. */
|
||||||
public LightSection[] lightSections;
|
public LightSection[] lightSections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the get method is called on a Y position above what's stored
|
||||||
|
* this value will be returned. <br><br>
|
||||||
|
*
|
||||||
|
* This needs to be manually defined since sky and block lights behave differently
|
||||||
|
* for values both above and below what's defined.
|
||||||
|
*/
|
||||||
|
public int aboveMaxYValue;
|
||||||
|
/** @see ChunkLightStorage#aboveMaxYValue */
|
||||||
|
public int belowMinYValue;
|
||||||
|
|
||||||
|
|
||||||
public ChunkLightStorage(int minY, int maxY)
|
|
||||||
|
//=============//
|
||||||
|
// constructor //
|
||||||
|
//=============//
|
||||||
|
|
||||||
|
public ChunkLightStorage(int minY, int maxY, int aboveMaxYValue, int belowMinYValue)
|
||||||
{
|
{
|
||||||
this.minY = minY;
|
this.minY = minY;
|
||||||
this.maxY = maxY;
|
this.maxY = maxY;
|
||||||
|
|
||||||
|
this.aboveMaxYValue = aboveMaxYValue;
|
||||||
|
this.belowMinYValue = belowMinYValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//=====================//
|
||||||
|
// getters and setters //
|
||||||
|
//=====================//
|
||||||
|
|
||||||
public int get(int x, int y, int z)
|
public int get(int x, int y, int z)
|
||||||
{
|
{
|
||||||
if (y < this.minY)
|
if (y < this.minY)
|
||||||
{
|
{
|
||||||
return 0;
|
return this.belowMinYValue;
|
||||||
}
|
}
|
||||||
if (y >= this.maxY)
|
else if (y >= this.maxY)
|
||||||
{
|
{
|
||||||
return 15;
|
return this.aboveMaxYValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (this.lightSections != null)
|
if (this.lightSections != null)
|
||||||
{
|
{
|
||||||
LightSection lightSection = this.lightSections[BitShiftUtil.divideByPowerOfTwo(y - this.minY, 4)];
|
LightSection lightSection = this.lightSections[BitShiftUtil.divideByPowerOfTwo(y - this.minY, 4)];
|
||||||
|
|||||||
+15
-3
@@ -38,7 +38,6 @@ import net.minecraft.core.BlockPos;
|
|||||||
import net.minecraft.world.level.LevelReader;
|
import net.minecraft.world.level.LevelReader;
|
||||||
import net.minecraft.world.level.LightLayer;
|
import net.minecraft.world.level.LightLayer;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
import net.minecraft.world.level.levelgen.Heightmap;
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
|
|
||||||
@@ -73,6 +72,13 @@ import net.minecraft.world.level.lighting.LevelLightEngine;
|
|||||||
import net.minecraft.core.SectionPos;
|
import net.minecraft.core.SectionPos;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public class ChunkWrapper implements IChunkWrapper
|
public class ChunkWrapper implements IChunkWrapper
|
||||||
{
|
{
|
||||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
||||||
@@ -358,7 +364,10 @@ public class ChunkWrapper implements IChunkWrapper
|
|||||||
{
|
{
|
||||||
if (this.blockLightStorage == null)
|
if (this.blockLightStorage == null)
|
||||||
{
|
{
|
||||||
this.blockLightStorage = new ChunkLightStorage(this.getMinBuildHeight(), this.getMaxBuildHeight());
|
this.blockLightStorage = new ChunkLightStorage(
|
||||||
|
this.getMinBuildHeight(), this.getMaxBuildHeight(),
|
||||||
|
// positions above and below the handled area should be unlit
|
||||||
|
LodUtil.MIN_MC_LIGHT, LodUtil.MIN_MC_LIGHT);
|
||||||
}
|
}
|
||||||
return this.blockLightStorage;
|
return this.blockLightStorage;
|
||||||
}
|
}
|
||||||
@@ -381,7 +390,10 @@ public class ChunkWrapper implements IChunkWrapper
|
|||||||
{
|
{
|
||||||
if (this.skyLightStorage == null)
|
if (this.skyLightStorage == null)
|
||||||
{
|
{
|
||||||
this.skyLightStorage = new ChunkLightStorage(this.getMinBuildHeight(), this.getMaxBuildHeight());
|
this.skyLightStorage = new ChunkLightStorage(
|
||||||
|
this.getMinBuildHeight(), this.getMaxBuildHeight(),
|
||||||
|
// positions above should be lit but positions below should be unlit
|
||||||
|
LodUtil.MAX_MC_LIGHT, LodUtil.MIN_MC_LIGHT);
|
||||||
}
|
}
|
||||||
return this.skyLightStorage;
|
return this.skyLightStorage;
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-12
@@ -16,7 +16,7 @@ import java.util.regex.Pattern;
|
|||||||
// Logger (for debug stuff)
|
// Logger (for debug stuff)
|
||||||
|
|
||||||
import com.seibel.distanthorizons.api.enums.config.DisallowSelectingViaConfigGui;
|
import com.seibel.distanthorizons.api.enums.config.DisallowSelectingViaConfigGui;
|
||||||
import com.seibel.distanthorizons.api.enums.config.EUpdateBranch;
|
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
|
||||||
import com.seibel.distanthorizons.core.config.Config;
|
import com.seibel.distanthorizons.core.config.Config;
|
||||||
import com.seibel.distanthorizons.core.config.ConfigBase;
|
import com.seibel.distanthorizons.core.config.ConfigBase;
|
||||||
import com.seibel.distanthorizons.core.config.types.*;
|
import com.seibel.distanthorizons.core.config.types.*;
|
||||||
@@ -98,6 +98,7 @@ public class ClassicConfigGUI
|
|||||||
public static final int SpaceFromRightScreen = 10;
|
public static final int SpaceFromRightScreen = 10;
|
||||||
public static final int ButtonWidthSpacing = 5;
|
public static final int ButtonWidthSpacing = 5;
|
||||||
public static final int ResetButtonWidth = 40;
|
public static final int ResetButtonWidth = 40;
|
||||||
|
public static final int ResetButtonHeight = 20;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,14 +245,14 @@ public class ClassicConfigGUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Changelog button
|
// Changelog button
|
||||||
if (Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() && Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE)
|
if (Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() && Config.Client.Advanced.AutoUpdater.updateBranch.get() == EDhApiUpdateBranch.STABLE)
|
||||||
{
|
{
|
||||||
this.addBtn(new TexturedButtonWidget(
|
this.addBtn(new TexturedButtonWidget(
|
||||||
// Where the button is on the screen
|
// Where the button is on the screen
|
||||||
this.width - 28, this.height - 28,
|
this.width - 28, this.height - 28,
|
||||||
// Width and height of the button
|
// Width and height of the button
|
||||||
20, 20,
|
20, 20,
|
||||||
// Offset
|
// texture UV Offset
|
||||||
0, 0,
|
0, 0,
|
||||||
// Some textuary stuff
|
// Some textuary stuff
|
||||||
0, new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"), 20, 20,
|
0, new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"), 20, 20,
|
||||||
@@ -269,18 +270,25 @@ public class ClassicConfigGUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
addBtn(MakeBtn(Translatable("distanthorizons.general.cancel"), this.width / 2 - 154, this.height - 28, 150, 20, button -> {
|
addBtn(MakeBtn(Translatable("distanthorizons.general.cancel"),
|
||||||
ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile();
|
this.width / 2 - 154, this.height - 28,
|
||||||
Objects.requireNonNull(minecraft).setScreen(parent);
|
150, 20,
|
||||||
}));
|
button ->
|
||||||
|
{
|
||||||
|
ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile();
|
||||||
|
Objects.requireNonNull(minecraft).setScreen(parent);
|
||||||
|
}));
|
||||||
doneButton = addBtn(MakeBtn(Translatable("distanthorizons.general.done"), this.width / 2 + 4, this.height - 28, 150, 20, (button) -> {
|
doneButton = addBtn(MakeBtn(Translatable("distanthorizons.general.done"), this.width / 2 + 4, this.height - 28, 150, 20, (button) -> {
|
||||||
ConfigBase.INSTANCE.configFileINSTANCE.saveToFile();
|
ConfigBase.INSTANCE.configFileINSTANCE.saveToFile();
|
||||||
Objects.requireNonNull(minecraft).setScreen(parent);
|
Objects.requireNonNull(minecraft).setScreen(parent);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this.list = new ConfigListWidget(this.minecraft, this.width * 2, this.height, 32, 32, 25);
|
this.list = new ConfigListWidget(this.minecraft, this.width * 2, this.height, 32, 32, 25);
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_20_6 // no background is rendered in MC 1.20.6+
|
||||||
if (this.minecraft != null && this.minecraft.level != null)
|
if (this.minecraft != null && this.minecraft.level != null)
|
||||||
this.list.setRenderBackground(false);
|
this.list.setRenderBackground(false);
|
||||||
|
#endif
|
||||||
|
|
||||||
this.addWidget(this.list);
|
this.addWidget(this.list);
|
||||||
|
|
||||||
@@ -311,6 +319,7 @@ public class ClassicConfigGUI
|
|||||||
initEntry(info, this.translationPrefix);
|
initEntry(info, this.translationPrefix);
|
||||||
Component name = Translatable(translationPrefix + info.getNameWCategory());
|
Component name = Translatable(translationPrefix + info.getNameWCategory());
|
||||||
|
|
||||||
|
|
||||||
if (ConfigEntry.class.isAssignableFrom(info.getClass()))
|
if (ConfigEntry.class.isAssignableFrom(info.getClass()))
|
||||||
{
|
{
|
||||||
Button.OnPress btnAction = button -> {
|
Button.OnPress btnAction = button -> {
|
||||||
@@ -319,12 +328,12 @@ public class ClassicConfigGUI
|
|||||||
this.reload = true;
|
this.reload = true;
|
||||||
Objects.requireNonNull(minecraft).setScreen(this);
|
Objects.requireNonNull(minecraft).setScreen(this);
|
||||||
};
|
};
|
||||||
int a = this.width - ConfigScreenConfigs.SpaceFromRightScreen - 150 - ConfigScreenConfigs.ButtonWidthSpacing - ConfigScreenConfigs.ResetButtonWidth;
|
int posX = this.width - ConfigScreenConfigs.SpaceFromRightScreen - 150 - ConfigScreenConfigs.ButtonWidthSpacing - ConfigScreenConfigs.ResetButtonWidth;
|
||||||
int b = 0;
|
int posZ = 0;
|
||||||
int c = ConfigScreenConfigs.ResetButtonWidth;
|
|
||||||
int d = 20;
|
|
||||||
|
|
||||||
Button resetButton = MakeBtn(Translatable("distanthorizons.general.reset").withStyle(ChatFormatting.RED), a, b, c, d, btnAction);
|
Button resetButton = MakeBtn(Translatable("distanthorizons.general.reset").withStyle(ChatFormatting.RED),
|
||||||
|
posX, posZ, ConfigScreenConfigs.ResetButtonWidth, ConfigScreenConfigs.ResetButtonHeight,
|
||||||
|
btnAction);
|
||||||
|
|
||||||
if (((EntryInfo) info.guiValue).widget instanceof Map.Entry)
|
if (((EntryInfo) info.guiValue).widget instanceof Map.Entry)
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@ public class GetConfigScreen
|
|||||||
case JavaFX:
|
case JavaFX:
|
||||||
return MinecraftScreen.getScreen(parent, new JavaScreenHandlerScreen(new ConfigScreen()), ModInfo.ID + ".title");
|
return MinecraftScreen.getScreen(parent, new JavaScreenHandlerScreen(new ConfigScreen()), ModInfo.ID + ".title");
|
||||||
default:
|
default:
|
||||||
return null;
|
throw new IllegalArgumentException("No config screen implementation defined for ["+useScreen+"].");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ public class GuiHelper
|
|||||||
/**
|
/**
|
||||||
* Helper static methods for versional compat
|
* Helper static methods for versional compat
|
||||||
*/
|
*/
|
||||||
public static Button MakeBtn(Component base, int a, int b, int c, int d, Button.OnPress action)
|
public static Button MakeBtn(Component base, int posX, int posZ, int width, int height, Button.OnPress action)
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_19_4
|
#if MC_VER < MC_1_19_4
|
||||||
return new Button(a, b, c, d, base, action);
|
return new Button(posX, posZ, width, height, base, action);
|
||||||
#else
|
#else
|
||||||
return Button.builder(base, action).bounds(a, b, c, d).build();
|
return Button.builder(base, action).bounds(posX, posZ, width, height).build();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
@@ -60,8 +60,12 @@ public class MinecraftScreen
|
|||||||
screen.init(); // Init our own config screen
|
screen.init(); // Init our own config screen
|
||||||
|
|
||||||
this.list = new ConfigListWidget(this.minecraft, this.width, this.height, 0, 0, 25); // Select the area to tint
|
this.list = new ConfigListWidget(this.minecraft, this.width, this.height, 0, 0, 25); // Select the area to tint
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_20_6 // no background is rendered in MC 1.20.6+
|
||||||
if (this.minecraft != null && this.minecraft.level != null) // Check if in game
|
if (this.minecraft != null && this.minecraft.level != null) // Check if in game
|
||||||
this.list.setRenderBackground(false); // Disable from rendering
|
this.list.setRenderBackground(false); // Disable from rendering
|
||||||
|
#endif
|
||||||
|
|
||||||
this.addWidget(this.list); // Add the tint to the things to be rendered
|
this.addWidget(this.list); // Add the tint to the things to be rendered
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-11
@@ -1,23 +1,19 @@
|
|||||||
package com.seibel.distanthorizons.common.wrappers.gui.updater;
|
package com.seibel.distanthorizons.common.wrappers.gui.updater;
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
|
||||||
import com.seibel.distanthorizons.api.enums.config.EUpdateBranch;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.gui.DhScreen;
|
import com.seibel.distanthorizons.common.wrappers.gui.DhScreen;
|
||||||
import com.seibel.distanthorizons.common.wrappers.gui.TexturedButtonWidget;
|
import com.seibel.distanthorizons.common.wrappers.gui.TexturedButtonWidget;
|
||||||
import com.seibel.distanthorizons.core.jar.ModJarInfo;
|
import com.seibel.distanthorizons.core.jar.ModJarInfo;
|
||||||
import com.seibel.distanthorizons.coreapi.ModInfo;
|
import com.seibel.distanthorizons.coreapi.ModInfo;
|
||||||
import com.seibel.distanthorizons.core.config.Config;
|
import com.seibel.distanthorizons.core.config.Config;
|
||||||
import com.seibel.distanthorizons.core.jar.JarUtils;
|
|
||||||
import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter;
|
import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter;
|
||||||
import com.seibel.distanthorizons.core.jar.updater.SelfUpdater;
|
import com.seibel.distanthorizons.core.jar.updater.SelfUpdater;
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
#if MC_VER >= MC_1_20_1
|
#if MC_VER >= MC_1_20_1
|
||||||
import net.minecraft.client.gui.GuiGraphics;
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
#else
|
#else
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
#endif
|
#endif
|
||||||
import net.minecraft.client.gui.screens.Screen;
|
import net.minecraft.client.gui.screens.Screen;
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
|
||||||
import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.*;
|
import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.*;
|
||||||
@@ -92,7 +88,7 @@ public class UpdateModScreen extends DhScreen
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE)
|
if (Config.Client.Advanced.AutoUpdater.updateBranch.get() == EDhApiUpdateBranch.STABLE)
|
||||||
{
|
{
|
||||||
this.addBtn(new TexturedButtonWidget(
|
this.addBtn(new TexturedButtonWidget(
|
||||||
// Where the button is on the screen
|
// Where the button is on the screen
|
||||||
@@ -151,17 +147,15 @@ public class UpdateModScreen extends DhScreen
|
|||||||
this.renderBackground(matrices, mouseX, mouseY, delta); // Render background
|
this.renderBackground(matrices, mouseX, mouseY, delta); // Render background
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// TODO: add the tooltips for the buttons
|
||||||
|
super.render(matrices, mouseX, mouseY, delta); // Render the buttons
|
||||||
|
// TODO: Add tooltips
|
||||||
|
|
||||||
// Render the text's
|
// Render the text's
|
||||||
DhDrawCenteredString(matrices, this.font, Translatable(ModInfo.ID + ".updater.text1"), this.width / 2, this.height / 2 - 35, 0xFFFFFF);
|
DhDrawCenteredString(matrices, this.font, Translatable(ModInfo.ID + ".updater.text1"), this.width / 2, this.height / 2 - 35, 0xFFFFFF);
|
||||||
DhDrawCenteredString(matrices, this.font,
|
DhDrawCenteredString(matrices, this.font,
|
||||||
Translatable(ModInfo.ID + ".updater.text2", currentVer, nextVer),
|
Translatable(ModInfo.ID + ".updater.text2", currentVer, nextVer),
|
||||||
this.width / 2, this.height / 2 - 20, 0x52FD52);
|
this.width / 2, this.height / 2 - 20, 0x52FD52);
|
||||||
|
|
||||||
// TODO: add the tooltips for the buttons
|
|
||||||
super.render(matrices, mouseX, mouseY, delta); // Render the buttons
|
|
||||||
|
|
||||||
// TODO: Add tooltips
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+5
-5
@@ -25,7 +25,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
import com.seibel.distanthorizons.api.enums.config.ELodShading;
|
import com.seibel.distanthorizons.api.enums.config.EDhApiLodShading;
|
||||||
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
|
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
|
||||||
@@ -113,11 +113,11 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
|
|||||||
@Override
|
@Override
|
||||||
public float getShade(EDhDirection lodDirection)
|
public float getShade(EDhDirection lodDirection)
|
||||||
{
|
{
|
||||||
ELodShading lodShading = Config.Client.Advanced.Graphics.AdvancedGraphics.lodShading.get();
|
EDhApiLodShading lodShading = Config.Client.Advanced.Graphics.AdvancedGraphics.lodShading.get();
|
||||||
switch (lodShading)
|
switch (lodShading)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case MINECRAFT:
|
case AUTO:
|
||||||
if (this.mc.level != null)
|
if (this.mc.level != null)
|
||||||
{
|
{
|
||||||
Direction mcDir = McObjectConverter.Convert(lodDirection);
|
Direction mcDir = McObjectConverter.Convert(lodDirection);
|
||||||
@@ -128,7 +128,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
|
|||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
case OLD_LIGHTING:
|
case ENABLED:
|
||||||
switch (lodDirection)
|
switch (lodDirection)
|
||||||
{
|
{
|
||||||
case DOWN:
|
case DOWN:
|
||||||
@@ -144,7 +144,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
|
|||||||
return 0.6F;
|
return 0.6F;
|
||||||
}
|
}
|
||||||
|
|
||||||
case NONE:
|
case DISABLED:
|
||||||
return 1.0F;
|
return 1.0F;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-6
@@ -25,6 +25,7 @@ import java.nio.FloatBuffer;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import com.mojang.blaze3d.pipeline.RenderTarget;
|
import com.mojang.blaze3d.pipeline.RenderTarget;
|
||||||
@@ -105,7 +106,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
|
|||||||
* In the case of immersive portals multiple levels may be active at once, causing conflicting lightmaps. <br>
|
* In the case of immersive portals multiple levels may be active at once, causing conflicting lightmaps. <br>
|
||||||
* Requiring the use of multiple {@link LightMapWrapper}.
|
* Requiring the use of multiple {@link LightMapWrapper}.
|
||||||
*/
|
*/
|
||||||
public HashMap<IDimensionTypeWrapper, LightMapWrapper> lightmapByDimensionType = new HashMap<>();
|
public ConcurrentHashMap<IDimensionTypeWrapper, LightMapWrapper> lightmapByDimensionType = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the render buffer that should be used when displaying levels to the screen.
|
* Holds the render buffer that should be used when displaying levels to the screen.
|
||||||
@@ -405,11 +406,8 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
|
|||||||
// so this will have to do for now
|
// so this will have to do for now
|
||||||
IDimensionTypeWrapper dimensionType = level.getDimensionType();
|
IDimensionTypeWrapper dimensionType = level.getDimensionType();
|
||||||
|
|
||||||
if (!this.lightmapByDimensionType.containsKey(dimensionType))
|
LightMapWrapper wrapper = this.lightmapByDimensionType.compute(dimensionType, (dimType, oldWrapper) -> new LightMapWrapper());
|
||||||
{
|
wrapper.uploadLightmap(lightPixels);
|
||||||
this.lightmapByDimensionType.put(dimensionType, new LightMapWrapper());
|
|
||||||
}
|
|
||||||
this.lightmapByDimensionType.get(dimensionType).uploadLightmap(lightPixels);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+50
-1
@@ -25,13 +25,19 @@ import net.minecraft.server.level.ServerLevel;
|
|||||||
import net.minecraft.world.level.LightLayer;
|
import net.minecraft.world.level.LightLayer;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkSource;
|
import net.minecraft.world.level.chunk.ChunkSource;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
public class ClientLevelWrapper implements IClientLevelWrapper
|
public class ClientLevelWrapper implements IClientLevelWrapper
|
||||||
{
|
{
|
||||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger(ClientLevelWrapper.class.getSimpleName());
|
private static final Logger LOGGER = DhLoggerBuilder.getLogger(ClientLevelWrapper.class.getSimpleName());
|
||||||
@@ -41,6 +47,9 @@ public class ClientLevelWrapper implements IClientLevelWrapper
|
|||||||
private final ClientLevel level;
|
private final ClientLevel level;
|
||||||
private final ClientBlockDetailMap blockMap = new ClientBlockDetailMap(this);
|
private final ClientBlockDetailMap blockMap = new ClientBlockDetailMap(this);
|
||||||
|
|
||||||
|
private BlockStateWrapper dirtBlockWrapper;
|
||||||
|
private BiomeWrapper plainsBiomeWrapper;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//=============//
|
//=============//
|
||||||
@@ -116,6 +125,46 @@ public class ClientLevelWrapper implements IClientLevelWrapper
|
|||||||
return this.blockMap.getColor(((BlockStateWrapper) blockState).blockState, (BiomeWrapper) biome, pos);
|
return this.blockMap.getColor(((BlockStateWrapper) blockState).blockState, (BiomeWrapper) biome, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDirtBlockColor()
|
||||||
|
{
|
||||||
|
if (this.dirtBlockWrapper == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.dirtBlockWrapper = (BlockStateWrapper) BlockStateWrapper.deserialize(BlockStateWrapper.DIRT_RESOURCE_LOCATION_STRING, this);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
// shouldn't happen, but just in case
|
||||||
|
LOGGER.warn("Unable to get dirt color with resource location ["+BlockStateWrapper.DIRT_RESOURCE_LOCATION_STRING+"] with level ["+this+"].", e);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.blockMap.getColor(this.dirtBlockWrapper.blockState, BiomeWrapper.EMPTY_WRAPPER, DhBlockPos.ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBiomeWrapper getPlainsBiomeWrapper()
|
||||||
|
{
|
||||||
|
if (this.plainsBiomeWrapper == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.plainsBiomeWrapper = (BiomeWrapper) BiomeWrapper.deserialize(BiomeWrapper.PLAINS_RESOURCE_LOCATION_STRING, this);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
// shouldn't happen, but just in case
|
||||||
|
LOGGER.warn("Unable to get planes biome with resource location ["+BiomeWrapper.PLAINS_RESOURCE_LOCATION_STRING+"] with level ["+this+"].", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.plainsBiomeWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IDimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }
|
public IDimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }
|
||||||
|
|
||||||
|
|||||||
+5
@@ -41,7 +41,12 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapp
|
|||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkSource;
|
import net.minecraft.world.level.chunk.ChunkSource;
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|||||||
+6
-1
@@ -66,7 +66,6 @@ import net.minecraft.server.level.ServerLevel;
|
|||||||
import net.minecraft.world.level.ChunkPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
import net.minecraft.world.level.chunk.UpgradeData;
|
import net.minecraft.world.level.chunk.UpgradeData;
|
||||||
@@ -79,6 +78,12 @@ import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
|
|||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Total: 3.135214124s
|
Total: 3.135214124s
|
||||||
=====================================
|
=====================================
|
||||||
|
|||||||
+2
-4
@@ -26,13 +26,11 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiWorldGenerationStep;
|
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiWorldGenerationStep;
|
||||||
import com.seibel.distanthorizons.core.generation.WorldGenerationQueue;
|
|
||||||
import com.seibel.distanthorizons.core.util.ThreadUtil;
|
|
||||||
import com.seibel.distanthorizons.core.util.objects.UncheckedInterruptedException;
|
import com.seibel.distanthorizons.core.util.objects.UncheckedInterruptedException;
|
||||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
||||||
import com.seibel.distanthorizons.core.util.objects.EventTimer;
|
import com.seibel.distanthorizons.core.util.objects.EventTimer;
|
||||||
import com.seibel.distanthorizons.core.util.threading.ThreadPools;
|
import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
||||||
|
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
@@ -123,7 +121,7 @@ public final class GenerationEvent
|
|||||||
public boolean terminate()
|
public boolean terminate()
|
||||||
{
|
{
|
||||||
LOGGER.info("======================DUMPING ALL THREADS FOR WORLD GEN=======================");
|
LOGGER.info("======================DUMPING ALL THREADS FOR WORLD GEN=======================");
|
||||||
ThreadPools.WORLD_GEN_THREAD_FACTORY.dumpAllThreadStacks();
|
ThreadPoolUtil.WORLD_GEN_THREAD_FACTORY.dumpAllThreadStacks();
|
||||||
this.future.cancel(true);
|
this.future.cancel(true);
|
||||||
return this.future.isCancelled();
|
return this.future.isCancelled();
|
||||||
}
|
}
|
||||||
|
|||||||
+33
-15
@@ -76,6 +76,11 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
|
|||||||
import net.minecraft.world.level.material.Fluids;
|
import net.minecraft.world.level.material.Fluids;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if MC_VER == MC_1_20_6
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkType;
|
||||||
|
#endif
|
||||||
|
|
||||||
import net.minecraft.world.level.material.Fluid;
|
import net.minecraft.world.level.material.Fluid;
|
||||||
|
|
||||||
|
|
||||||
@@ -164,7 +169,8 @@ public class ChunkLoader
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
blockStateContainer = tagSection.contains("block_states", 10)
|
blockStateContainer = tagSection.contains("block_states", 10)
|
||||||
? BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagSection.getCompound("block_states")).promotePartial(string -> logErrors(chunkPos, sectionYPos, string)).getOrThrow(false, LOGGER::error)
|
? BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagSection.getCompound("block_states")).promotePartial(string -> logErrors(chunkPos, sectionYPos, string))
|
||||||
|
#if MC_VER < MC_1_20_6 .getOrThrow(false, LOGGER::error) #else .getOrThrow((message) -> (RuntimeException) LOGGER.errorAndThrow(message, null)) #endif
|
||||||
: new PalettedContainer<BlockState>(Block.BLOCK_STATE_REGISTRY, Blocks.AIR.defaultBlockState(), PalettedContainer.Strategy.SECTION_STATES);
|
: new PalettedContainer<BlockState>(Block.BLOCK_STATE_REGISTRY, Blocks.AIR.defaultBlockState(), PalettedContainer.Strategy.SECTION_STATES);
|
||||||
|
|
||||||
#if MC_VER < MC_1_18_2
|
#if MC_VER < MC_1_18_2
|
||||||
@@ -172,10 +178,13 @@ public class ChunkLoader
|
|||||||
? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, sectionYPos, string)).getOrThrow(false, LOGGER::error)
|
? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, sectionYPos, string)).getOrThrow(false, LOGGER::error)
|
||||||
: new PalettedContainer<Biome>(biomes, biomes.getOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES);
|
: new PalettedContainer<Biome>(biomes, biomes.getOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
biomeContainer = tagSection.contains("biomes", 10)
|
biomeContainer = tagSection.contains("biomes", 10)
|
||||||
? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, i, (String) string)).getOrThrow(false, LOGGER::error)
|
? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, i, (String) string))
|
||||||
|
#if MC_VER < MC_1_20_6 .getOrThrow(false, LOGGER::error) #else .getOrThrow((message) -> (RuntimeException) LOGGER.errorAndThrow(message, null)) #endif
|
||||||
: new PalettedContainer<Holder<Biome>>(biomes.asHolderIdMap(), biomes.getHolderOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES);
|
: new PalettedContainer<Holder<Biome>>(biomes.asHolderIdMap(), biomes.getHolderOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MC_VER < MC_1_20_1
|
#if MC_VER < MC_1_20_1
|
||||||
chunkSections[sectionId] = new LevelChunkSection(sectionYPos, blockStateContainer, biomeContainer);
|
chunkSections[sectionId] = new LevelChunkSection(sectionYPos, blockStateContainer, biomeContainer);
|
||||||
#else
|
#else
|
||||||
@@ -213,14 +222,15 @@ public class ChunkLoader
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ChunkStatus.ChunkType readChunkType(CompoundTag tagLevel)
|
public static #if MC_VER < MC_1_20_6 ChunkStatus.ChunkType #else ChunkType #endif readChunkType(CompoundTag tagLevel)
|
||||||
{
|
{
|
||||||
ChunkStatus chunkStatus = ChunkStatus.byName(tagLevel.getString("Status"));
|
ChunkStatus chunkStatus = ChunkStatus.byName(tagLevel.getString("Status"));
|
||||||
if (chunkStatus != null)
|
if (chunkStatus != null)
|
||||||
{
|
{
|
||||||
return chunkStatus.getChunkType();
|
return chunkStatus.getChunkType();
|
||||||
}
|
}
|
||||||
return ChunkStatus.ChunkType.PROTOCHUNK;
|
|
||||||
|
return #if MC_VER < MC_1_20_6 ChunkStatus.ChunkType.PROTOCHUNK; #else ChunkType.PROTOCHUNK; #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LevelChunk read(WorldGenLevel level, ChunkPos chunkPos, CompoundTag chunkData)
|
public static LevelChunk read(WorldGenLevel level, ChunkPos chunkPos, CompoundTag chunkData)
|
||||||
@@ -262,19 +272,27 @@ public class ChunkLoader
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ChunkStatus.ChunkType chunkType = readChunkType(tagLevel);
|
#if MC_VER < MC_1_20_6
|
||||||
#if MC_VER < MC_1_18_2
|
ChunkStatus.ChunkType chunkType;
|
||||||
if (chunkType != ChunkStatus.ChunkType.LEVELCHUNK)
|
|
||||||
return null;
|
|
||||||
#else
|
#else
|
||||||
BlendingData blendingData = readBlendingData(tagLevel);
|
ChunkType chunkType;
|
||||||
#if MC_VER < MC_1_19_2
|
|
||||||
if (chunkType == ChunkStatus.ChunkType.PROTOCHUNK && (blendingData == null || !blendingData.oldNoise()))
|
|
||||||
return null;
|
|
||||||
#else
|
|
||||||
if (chunkType == ChunkStatus.ChunkType.PROTOCHUNK && blendingData == null)
|
|
||||||
return null;
|
|
||||||
#endif
|
#endif
|
||||||
|
chunkType = readChunkType(tagLevel);
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_18_2
|
||||||
|
if (chunkType != ChunkStatus.ChunkType.LEVELCHUNK)
|
||||||
|
return null;
|
||||||
|
#else
|
||||||
|
|
||||||
|
BlendingData blendingData = readBlendingData(tagLevel);
|
||||||
|
#if MC_VER < MC_1_19_2
|
||||||
|
if (chunkType == ChunkStatus.ChunkType.PROTOCHUNK && (blendingData == null || !blendingData.oldNoise()))
|
||||||
|
return null;
|
||||||
|
#else
|
||||||
|
if (chunkType == #if MC_VER < MC_1_20_6 ChunkStatus.ChunkType.PROTOCHUNK #else ChunkType.PROTOCHUNK #endif && blendingData == null)
|
||||||
|
return null;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
long inhabitedTime = tagLevel.getLong("InhabitedTime");
|
long inhabitedTime = tagLevel.getLong("InhabitedTime");
|
||||||
|
|||||||
+89
-59
@@ -25,9 +25,11 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||||||
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
|
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
|
||||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
|
import com.seibel.distanthorizons.core.util.LodUtil;
|
||||||
import net.minecraft.world.level.block.EntityBlock;
|
import net.minecraft.world.level.block.EntityBlock;
|
||||||
import net.minecraft.world.level.block.SpawnerBlock;
|
import net.minecraft.world.level.block.SpawnerBlock;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||||
@@ -50,28 +52,38 @@ import net.minecraft.world.level.block.Blocks;
|
|||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.ImposterProtoChunk;
|
import net.minecraft.world.level.chunk.ImposterProtoChunk;
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
import net.minecraft.world.level.lighting.LevelLightEngine;
|
import net.minecraft.world.level.lighting.LevelLightEngine;
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public class DhLitWorldGenRegion extends WorldGenRegion
|
public class DhLitWorldGenRegion extends WorldGenRegion
|
||||||
{
|
{
|
||||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
|
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
|
||||||
|
|
||||||
|
private static ChunkStatus debugTriggeredForStatus = null;
|
||||||
|
|
||||||
|
|
||||||
public final DummyLightEngine lightEngine;
|
public final DummyLightEngine lightEngine;
|
||||||
public final BatchGenerationEnvironment.EmptyChunkGenerator generator;
|
public final BatchGenerationEnvironment.EmptyChunkGenerator generator;
|
||||||
public final int writeRadius;
|
public final int writeRadius;
|
||||||
public final int size;
|
public final int size;
|
||||||
|
|
||||||
private final ChunkPos firstPos;
|
private final ChunkPos firstPos;
|
||||||
private final List<ChunkAccess> cache;
|
private final List<ChunkAccess> cache;
|
||||||
Long2ObjectOpenHashMap<ChunkAccess> chunkMap = new Long2ObjectOpenHashMap<ChunkAccess>();
|
private final Long2ObjectOpenHashMap<ChunkAccess> chunkMap = new Long2ObjectOpenHashMap<ChunkAccess>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Present to reduce the chance that we accidentally break underlying MC code that isn't thread safe,
|
* Present to reduce the chance that we accidentally break underlying MC code that isn't thread safe,
|
||||||
* specifically: "it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap.getAndMoveToFirst()"
|
* specifically: "it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap.getAndMoveToFirst()"
|
||||||
*/
|
*/
|
||||||
ReentrantLock getChunkLock = new ReentrantLock();
|
private final ReentrantLock getChunkLock = new ReentrantLock();
|
||||||
|
|
||||||
#if MC_VER < MC_1_18_2
|
#if MC_VER < MC_1_18_2
|
||||||
private ChunkPos overrideCenterPos = null;
|
private ChunkPos overrideCenterPos = null;
|
||||||
@@ -198,12 +210,9 @@ public class DhLitWorldGenRegion extends WorldGenRegion
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip BlockEntity stuff. It aren't really needed
|
/** Skip BlockEntity stuff. They aren't needed for our use case. */
|
||||||
@Override
|
@Override
|
||||||
public boolean addFreshEntity(Entity entity)
|
public boolean addFreshEntity(@NotNull Entity entity) { return true; }
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allays have empty chunks even if it's outside the worldGenRegion
|
// Allays have empty chunks even if it's outside the worldGenRegion
|
||||||
// @Override
|
// @Override
|
||||||
@@ -214,13 +223,13 @@ public class DhLitWorldGenRegion extends WorldGenRegion
|
|||||||
// Override to ensure no other mod mixins cause skipping the overrided
|
// Override to ensure no other mod mixins cause skipping the overrided
|
||||||
// getChunk(...)
|
// getChunk(...)
|
||||||
@Override
|
@Override
|
||||||
public ChunkAccess getChunk(int i, int j)
|
public @NotNull ChunkAccess getChunk(int chunkX, int chunkZ)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// lock is to prevent issues with underlying MC code that doesn't support multithreading
|
// lock is to prevent issues with underlying MC code that doesn't support multithreading
|
||||||
this.getChunkLock.lock();
|
this.getChunkLock.lock();
|
||||||
return this.getChunk(i, j, ChunkStatus.EMPTY);
|
return this.getChunk(chunkX, chunkZ, ChunkStatus.EMPTY);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -231,13 +240,19 @@ public class DhLitWorldGenRegion extends WorldGenRegion
|
|||||||
// Override to ensure no other mod mixins cause skipping the overrided
|
// Override to ensure no other mod mixins cause skipping the overrided
|
||||||
// getChunk(...)
|
// getChunk(...)
|
||||||
@Override
|
@Override
|
||||||
public ChunkAccess getChunk(int i, int j, ChunkStatus chunkStatus)
|
public @NotNull ChunkAccess getChunk(int chunkX, int chunkZ, @NotNull ChunkStatus chunkStatus)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// lock is to prevent issues with underlying MC code that doesn't support multithreading
|
// lock is to prevent issues with underlying MC code that doesn't support multithreading
|
||||||
this.getChunkLock.lock();
|
this.getChunkLock.lock();
|
||||||
return this.getChunk(i, j, chunkStatus, true);
|
|
||||||
|
ChunkAccess chunk = this.getChunk(chunkX, chunkZ, chunkStatus, true);
|
||||||
|
if (chunk == null)
|
||||||
|
{
|
||||||
|
LodUtil.assertNotReach("getChunk shouldn't return null values");
|
||||||
|
}
|
||||||
|
return chunk;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -245,28 +260,12 @@ public class DhLitWorldGenRegion extends WorldGenRegion
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use this instead of super.getChunk() to bypass C2ME concurrency checks
|
/** Allows creating empty chunks even if they're outside the worldGenRegion */
|
||||||
private ChunkAccess superGetChunk(int x, int z, ChunkStatus cs)
|
|
||||||
{
|
|
||||||
int k = x - firstPos.x;
|
|
||||||
int l = z - firstPos.z;
|
|
||||||
return cache.get(k + l * size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use this instead of super.hasChunk() to bypass C2ME concurrency checks
|
|
||||||
public boolean superHasChunk(int x, int z)
|
|
||||||
{
|
|
||||||
int k = x - firstPos.x;
|
|
||||||
int l = z - firstPos.z;
|
|
||||||
return l >= 0 && l < size && k >= 0 && k < size;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow creating empty chunks even if it's outside the worldGenRegion
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public ChunkAccess getChunk(int i, int j, ChunkStatus chunkStatus, boolean bl)
|
public ChunkAccess getChunk(int chunkX, int chunkZ, @NotNull ChunkStatus chunkStatus, boolean returnNonNull)
|
||||||
{
|
{
|
||||||
ChunkAccess chunk = getChunkAccess(i, j, chunkStatus, bl);
|
ChunkAccess chunk = this.getChunkAccess(chunkX, chunkZ, chunkStatus, returnNonNull);
|
||||||
if (chunk instanceof LevelChunk)
|
if (chunk instanceof LevelChunk)
|
||||||
{
|
{
|
||||||
chunk = new ImposterProtoChunk((LevelChunk) chunk #if MC_VER >= MC_1_18_2 , true #endif );
|
chunk = new ImposterProtoChunk((LevelChunk) chunk #if MC_VER >= MC_1_18_2 , true #endif );
|
||||||
@@ -274,67 +273,98 @@ public class DhLitWorldGenRegion extends WorldGenRegion
|
|||||||
return chunk;
|
return chunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ChunkStatus debugTriggeredForStatus = null;
|
/**
|
||||||
|
* @param returnNonNull if true this method will always return a non-null chunk,
|
||||||
private ChunkAccess getChunkAccess(int i, int j, ChunkStatus chunkStatus, boolean bl)
|
* if false it will return null if no chunk exists at the given position with the given status
|
||||||
|
*/
|
||||||
|
private ChunkAccess getChunkAccess(int chunkX, int chunkZ, ChunkStatus chunkStatus, boolean returnNonNull)
|
||||||
{
|
{
|
||||||
ChunkAccess chunk = superHasChunk(i, j) ? superGetChunk(i, j, ChunkStatus.EMPTY) : null;
|
ChunkAccess chunk = this.superHasChunk(chunkX, chunkZ) ? this.superGetChunk(chunkX, chunkZ) : null;
|
||||||
if (chunk != null && chunk.getStatus().isOrAfter(chunkStatus))
|
if (chunk != null && chunk.getStatus().isOrAfter(chunkStatus))
|
||||||
{
|
{
|
||||||
return chunk;
|
return chunk;
|
||||||
}
|
}
|
||||||
if (!bl)
|
else if (!returnNonNull)
|
||||||
|
{
|
||||||
|
// no chunk found with the necessary status and null return values are allowed
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// we need a non-null chunk
|
||||||
if (chunk == null)
|
if (chunk == null)
|
||||||
{
|
{
|
||||||
chunk = chunkMap.get(ChunkPos.asLong(i, j));
|
// check memory
|
||||||
|
chunk = this.chunkMap.get(ChunkPos.asLong(chunkX, chunkZ));
|
||||||
if (chunk == null)
|
if (chunk == null)
|
||||||
{
|
{
|
||||||
chunk = generator.generate(i, j);
|
// chunk isn't in memory, generate a new one
|
||||||
|
chunk = this.generator.generate(chunkX, chunkZ);
|
||||||
if (chunk == null)
|
if (chunk == null)
|
||||||
|
{
|
||||||
throw new NullPointerException("The provided generator should not return null!");
|
throw new NullPointerException("The provided generator should not return null!");
|
||||||
chunkMap.put(ChunkPos.asLong(i, j), chunk);
|
}
|
||||||
|
this.chunkMap.put(ChunkPos.asLong(chunkX, chunkZ), chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chunkStatus != ChunkStatus.EMPTY && chunkStatus != debugTriggeredForStatus)
|
if (chunkStatus != ChunkStatus.EMPTY && chunkStatus != debugTriggeredForStatus)
|
||||||
{
|
{
|
||||||
LOGGER.info("WorldGen requiring " + chunkStatus
|
LOGGER.info("WorldGen requiring " + chunkStatus
|
||||||
+ " outside expected range detected. Force passing EMPTY chunk and seeing if it works.");
|
+ " outside expected range detected. Force passing EMPTY chunk and seeing if it works.");
|
||||||
debugTriggeredForStatus = chunkStatus;
|
debugTriggeredForStatus = chunkStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
return chunk;
|
return chunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Overriding allows us to use our own lighting engine */
|
/** Use this instead of super.hasChunk() to bypass C2ME concurrency checks */
|
||||||
@Override
|
public boolean superHasChunk(int x, int z)
|
||||||
public LevelLightEngine getLightEngine() { return this.lightEngine; }
|
|
||||||
|
|
||||||
/** Overriding allows us to use our own lighting engine */
|
|
||||||
@Override
|
|
||||||
public int getBrightness(LightLayer lightLayer, BlockPos blockPos) { return 0; }
|
|
||||||
|
|
||||||
/** Overriding allows us to use our own lighting engine */
|
|
||||||
@Override
|
|
||||||
public int getRawBrightness(BlockPos blockPos, int i) { return 0; }
|
|
||||||
|
|
||||||
/** Overriding allows us to use our own lighting engine */
|
|
||||||
@Override
|
|
||||||
public boolean canSeeSky(BlockPos blockPos)
|
|
||||||
{
|
{
|
||||||
return (getBrightness(LightLayer.SKY, blockPos) >= getMaxLightLevel());
|
int k = x - this.firstPos.x;
|
||||||
|
int l = z - this.firstPos.z;
|
||||||
|
return l >= 0 && l < this.size && k >= 0 && k < this.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver)
|
/** Use this instead of super.getChunk() to bypass C2ME concurrency checks */
|
||||||
|
private ChunkAccess superGetChunk(int x, int z)
|
||||||
{
|
{
|
||||||
return calculateBlockTint(blockPos, colorResolver);
|
int k = x - this.firstPos.x;
|
||||||
|
int l = z - this.firstPos.z;
|
||||||
|
return this.cache.get(k + l * this.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Overriding allows us to use our own lighting engine */
|
||||||
|
@Override
|
||||||
|
public @NotNull LevelLightEngine getLightEngine() { return this.lightEngine; }
|
||||||
|
|
||||||
|
/** Overriding allows us to use our own lighting engine */
|
||||||
|
@Override
|
||||||
|
public int getBrightness(@NotNull LightLayer lightLayer, @NotNull BlockPos blockPos) { return 0; }
|
||||||
|
|
||||||
|
/** Overriding allows us to use our own lighting engine */
|
||||||
|
@Override
|
||||||
|
public int getRawBrightness(@NotNull BlockPos blockPos, int i) { return 0; }
|
||||||
|
|
||||||
|
/** Overriding allows us to use our own lighting engine */
|
||||||
|
@Override
|
||||||
|
public boolean canSeeSky(@NotNull BlockPos blockPos)
|
||||||
|
{
|
||||||
|
return (this.getBrightness(LightLayer.SKY, blockPos) >= this.getMaxLightLevel());
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver)
|
||||||
|
{
|
||||||
|
return this.calculateBlockTint(blockPos, colorResolver);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Biome _getBiome(BlockPos pos)
|
private Biome _getBiome(BlockPos pos)
|
||||||
{
|
{
|
||||||
#if MC_VER >= MC_1_18_2
|
#if MC_VER >= MC_1_18_2
|
||||||
return getBiome(pos).value();
|
return this.getBiome(pos).value();
|
||||||
#else
|
#else
|
||||||
return getBiome(pos);
|
return this.getBiome(pos);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-2
@@ -23,15 +23,24 @@ import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
|
|||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IStarlightAccessor;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IStarlightAccessor;
|
||||||
|
|
||||||
import net.minecraft.world.level.BlockGetter;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
|
import net.minecraft.world.level.chunk.LightChunkGetter;
|
||||||
|
|
||||||
#if MC_VER >= MC_1_17_1
|
#if MC_VER >= MC_1_17_1
|
||||||
import net.minecraft.world.level.LevelHeightAccessor;
|
import net.minecraft.world.level.LevelHeightAccessor;
|
||||||
#endif
|
#endif
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.LightChunkGetter;
|
|
||||||
#if MC_VER >= MC_1_20_1
|
#if MC_VER >= MC_1_20_1
|
||||||
import net.minecraft.world.level.chunk.LightChunk;
|
import net.minecraft.world.level.chunk.LightChunk;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class LightGetterAdaptor implements LightChunkGetter
|
public class LightGetterAdaptor implements LightChunkGetter
|
||||||
{
|
{
|
||||||
private final BlockGetter heightGetter;
|
private final BlockGetter heightGetter;
|
||||||
|
|||||||
+7
-1
@@ -17,6 +17,10 @@ import java.nio.file.Path;
|
|||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
#if MC_VER >= MC_1_20_6
|
||||||
|
import net.minecraft.world.level.chunk.storage.RegionStorageInfo;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated should be replaced with net.minecraft.world.level.chunk.storage.IOWorker to
|
* @deprecated should be replaced with net.minecraft.world.level.chunk.storage.IOWorker to
|
||||||
* prevent potential file corruption and issues with the C2ME mod.
|
* prevent potential file corruption and issues with the C2ME mod.
|
||||||
@@ -180,8 +184,10 @@ public class RegionFileStorageExternalCache implements AutoCloseable
|
|||||||
Path regionFilePath = storageFolderPath.resolve("r." + pos.getRegionX() + "." + pos.getRegionZ() + ".mca");
|
Path regionFilePath = storageFolderPath.resolve("r." + pos.getRegionX() + "." + pos.getRegionZ() + ".mca");
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
rFile = new RegionFile(regionFilePath.toFile(), storageFolderPath.toFile(), false);
|
rFile = new RegionFile(regionFilePath.toFile(), storageFolderPath.toFile(), false);
|
||||||
#else
|
#elif MC_VER <= MC_1_20_4
|
||||||
rFile = new RegionFile(regionFilePath, storageFolderPath, false);
|
rFile = new RegionFile(regionFilePath, storageFolderPath, false);
|
||||||
|
#else
|
||||||
|
rFile = new RegionFile(new RegionStorageInfo("level", null, "level type"), regionFilePath, storageFolderPath, false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
this.regionFileCache.add(new RegionFileCache(ChunkPos.asLong(pos.getRegionX(), pos.getRegionZ()), rFile));
|
this.regionFileCache.add(new RegionFileCache(ChunkPos.asLong(pos.getRegionX(), pos.getRegionZ()), rFile));
|
||||||
|
|||||||
+6
-1
@@ -35,7 +35,6 @@ import net.minecraft.server.level.WorldGenRegion;
|
|||||||
import net.minecraft.world.level.ChunkPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.world.level.WorldGenLevel;
|
import net.minecraft.world.level.WorldGenLevel;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.levelgen.WorldGenSettings;
|
import net.minecraft.world.level.levelgen.WorldGenSettings;
|
||||||
#if MC_VER < MC_1_19_2
|
#if MC_VER < MC_1_19_2
|
||||||
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
|
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
|
||||||
@@ -57,6 +56,12 @@ import net.minecraft.world.level.levelgen.structure.StructureStart;
|
|||||||
import net.minecraft.world.level.levelgen.feature.StructureFeature;
|
import net.minecraft.world.level.levelgen.feature.StructureFeature;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class WorldGenStructFeatManager extends #if MC_VER < MC_1_19_2 StructureFeatureManager #else StructureManager #endif
|
public class WorldGenStructFeatManager extends #if MC_VER < MC_1_19_2 StructureFeatureManager #else StructureManager #endif
|
||||||
|
|||||||
+7
-3
@@ -27,15 +27,19 @@ import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGeneratio
|
|||||||
import com.seibel.distanthorizons.common.wrappers.worldGeneration.ThreadedParameters;
|
import com.seibel.distanthorizons.common.wrappers.worldGeneration.ThreadedParameters;
|
||||||
|
|
||||||
import net.minecraft.server.level.WorldGenRegion;
|
import net.minecraft.server.level.WorldGenRegion;
|
||||||
#if MC_VER < MC_1_19_2
|
|
||||||
#endif
|
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
|
|
||||||
#if MC_VER >= MC_1_18_2
|
#if MC_VER >= MC_1_18_2
|
||||||
import net.minecraft.world.level.levelgen.blending.Blender;
|
import net.minecraft.world.level.levelgen.blending.Blender;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
public final class StepBiomes
|
public final class StepBiomes
|
||||||
{
|
{
|
||||||
public static final ChunkStatus STATUS = ChunkStatus.BIOMES;
|
public static final ChunkStatus STATUS = ChunkStatus.BIOMES;
|
||||||
|
|||||||
+6
-1
@@ -27,11 +27,16 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
|||||||
import com.seibel.distanthorizons.core.util.gridList.ArrayGridList;
|
import com.seibel.distanthorizons.core.util.gridList.ArrayGridList;
|
||||||
|
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
import net.minecraft.world.level.levelgen.Heightmap;
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public final class StepFeatures
|
public final class StepFeatures
|
||||||
{
|
{
|
||||||
|
|||||||
+7
-5
@@ -28,17 +28,19 @@ import com.seibel.distanthorizons.common.wrappers.worldGeneration.ThreadedParame
|
|||||||
|
|
||||||
import com.seibel.distanthorizons.core.util.objects.UncheckedInterruptedException;
|
import com.seibel.distanthorizons.core.util.objects.UncheckedInterruptedException;
|
||||||
import net.minecraft.server.level.WorldGenRegion;
|
import net.minecraft.server.level.WorldGenRegion;
|
||||||
#if MC_VER >= MC_1_17_1
|
|
||||||
#endif
|
|
||||||
#if MC_VER < MC_1_19_2
|
|
||||||
#endif
|
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
|
|
||||||
#if MC_VER >= MC_1_18_2
|
#if MC_VER >= MC_1_18_2
|
||||||
import net.minecraft.world.level.levelgen.blending.Blender;
|
import net.minecraft.world.level.levelgen.blending.Blender;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
public final class StepNoise
|
public final class StepNoise
|
||||||
{
|
{
|
||||||
private static final ChunkStatus STATUS = ChunkStatus.NOISE;
|
private static final ChunkStatus STATUS = ChunkStatus.NOISE;
|
||||||
|
|||||||
+7
-3
@@ -27,12 +27,16 @@ import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGeneratio
|
|||||||
import com.seibel.distanthorizons.common.wrappers.worldGeneration.ThreadedParameters;
|
import com.seibel.distanthorizons.common.wrappers.worldGeneration.ThreadedParameters;
|
||||||
|
|
||||||
import net.minecraft.server.level.WorldGenRegion;
|
import net.minecraft.server.level.WorldGenRegion;
|
||||||
#if MC_VER < MC_1_19_2
|
|
||||||
#endif
|
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public final class StepStructureReference
|
public final class StepStructureReference
|
||||||
{
|
{
|
||||||
private static final ChunkStatus STATUS = ChunkStatus.STRUCTURE_REFERENCES;
|
private static final ChunkStatus STATUS = ChunkStatus.STRUCTURE_REFERENCES;
|
||||||
|
|||||||
+7
-1
@@ -30,10 +30,16 @@ import com.seibel.distanthorizons.common.wrappers.worldGeneration.ThreadedParame
|
|||||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import net.minecraft.server.level.WorldGenRegion;
|
import net.minecraft.server.level.WorldGenRegion;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public final class StepStructureStart
|
public final class StepStructureStart
|
||||||
{
|
{
|
||||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
||||||
|
|||||||
+7
-2
@@ -28,9 +28,14 @@ import com.seibel.distanthorizons.common.wrappers.worldGeneration.ThreadedParame
|
|||||||
|
|
||||||
import net.minecraft.server.level.WorldGenRegion;
|
import net.minecraft.server.level.WorldGenRegion;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
import net.minecraft.world.level.levelgen.Heightmap;
|
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
|
#else
|
||||||
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public final class StepSurface
|
public final class StepSurface
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
accessWidener v1 named
|
||||||
|
|
||||||
|
# used when determining where to save files to
|
||||||
|
accessible field net/minecraft/world/level/storage/DimensionDataStorage dataFolder Ljava/io/File;
|
||||||
|
|
||||||
|
# used when rendering
|
||||||
|
accessible method net/minecraft/client/renderer/GameRenderer getFov (Lnet/minecraft/client/Camera;FZ)D
|
||||||
|
|
||||||
|
# used for grabbing vanilla rendered chunks
|
||||||
|
accessible field net/minecraft/client/renderer/LevelRenderer visibleSections Lit/unimi/dsi/fastutil/objects/ObjectArrayList;
|
||||||
|
|
||||||
|
#accessible method net/minecraft/client/renderer/LevelRenderer renderSectionLayer (Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V
|
||||||
|
|
||||||
|
# world generation
|
||||||
|
# accessible method net/minecraft/world/level/lighting/LayerLightEngine queueSectionData (JLnet/minecraft/world/level/chunk/DataLayer;Z)V
|
||||||
|
accessible field net/minecraft/world/level/chunk/LevelChunk loaded Z
|
||||||
|
accessible field net/minecraft/world/level/lighting/LightEngine storage Lnet/minecraft/world/level/lighting/LayerLightSectionStorage;
|
||||||
|
accessible method net/minecraft/world/level/lighting/LayerLightSectionStorage lightOnInSection (J)Z
|
||||||
|
|
||||||
|
# lod generation from save file
|
||||||
|
accessible field net/minecraft/world/level/chunk/storage/ChunkStorage worker Lnet/minecraft/world/level/chunk/storage/IOWorker;
|
||||||
|
accessible field net/minecraft/world/level/chunk/storage/IOWorker storage Lnet/minecraft/world/level/chunk/storage/RegionFileStorage;
|
||||||
|
accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage regionCache Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap;
|
||||||
|
accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage folder Ljava/nio/file/Path;
|
||||||
|
|
||||||
|
# grabbing textures
|
||||||
|
accessible class net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture
|
||||||
|
accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameX (I)I
|
||||||
|
accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameY (I)I
|
||||||
|
accessible field net/minecraft/client/renderer/texture/SpriteContents animatedTexture Lnet/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture;
|
||||||
|
accessible field net/minecraft/client/renderer/texture/SpriteContents originalImage Lcom/mojang/blaze3d/platform/NativeImage;
|
||||||
|
|
||||||
|
# UI stuff
|
||||||
|
accessible field net/minecraft/client/gui/components/AbstractButton SPRITES Lnet/minecraft/client/gui/components/WidgetSprites;
|
||||||
|
# Handles inserting the config button
|
||||||
|
accessible field net/minecraft/client/gui/layouts/HeaderAndFooterLayout headerFrame Lnet/minecraft/client/gui/layouts/FrameLayout;
|
||||||
|
accessible field net/minecraft/client/gui/layouts/FrameLayout children Ljava/util/List;
|
||||||
|
accessible class net/minecraft/client/gui/layouts/FrameLayout$ChildContainer
|
||||||
|
accessible field net/minecraft/client/gui/layouts/LinearLayout wrapped Lnet/minecraft/client/gui/layouts/GridLayout;
|
||||||
|
|
||||||
|
# hacky stuff
|
||||||
|
accessible field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore;
|
||||||
|
mutable field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore;
|
||||||
|
accessible field net/minecraft/client/gui/components/AbstractSelectionList scrollAmount D # Hack to bypass vanilla's setScrollAmount's clamp
|
||||||
|
|
||||||
|
|
||||||
+1
-1
Submodule coreSubProjects updated: 87e5647379...76f28e648c
+63
-55
@@ -1,55 +1,83 @@
|
|||||||
unimined.minecraft {
|
plugins {
|
||||||
fabric {
|
id "fabric-loom" version "1.6-SNAPSHOT"
|
||||||
loader rootProject.fabric_loader_version
|
}
|
||||||
accessWidener(project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener"))
|
|
||||||
|
|
||||||
skipInsertAw = true
|
loom {
|
||||||
|
accessWidenerPath = project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
|
||||||
|
|
||||||
|
// "runs" isn't required, but when we do need it then it can be useful
|
||||||
|
runs {
|
||||||
|
client {
|
||||||
|
client()
|
||||||
|
setConfigName("Fabric Client")
|
||||||
|
ideConfigGenerated(true)
|
||||||
|
runDir("../run")
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
server()
|
||||||
|
setConfigName("Fabric Server")
|
||||||
|
ideConfigGenerated(true)
|
||||||
|
runDir("../run")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
inputFile = shadowJar.archiveFile
|
||||||
|
dependsOn shadowJar
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
// The addModJar basically embeds the mod to the built jar
|
// The addModJar basically embeds the mod to the built jar
|
||||||
addModJar
|
addModJar
|
||||||
include.extendsFrom addModJar
|
include.extendsFrom addModJar
|
||||||
modImplementation.extendsFrom addModJar
|
modImplementation.extendsFrom addModJar
|
||||||
dummy
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def addMod(path, enabled) {
|
def addMod(path, enabled) {
|
||||||
if (enabled == "2")
|
if (enabled == "2")
|
||||||
dependencies { modImplementation(path) }
|
dependencies { modImplementation(path) }
|
||||||
else if (enabled == "1")
|
else if (enabled == "1")
|
||||||
dependencies { compileOnly(path) }
|
dependencies { modCompileOnly(path) }
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: There currently seems to be a bug which causes the regular addModJar to not work, swap back to the regular addModJar when fixed
|
|
||||||
def addModJar_(path) {
|
|
||||||
dependencies {
|
|
||||||
modImplementation(path)
|
|
||||||
include(path)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
annotationProcessor "javax.annotation:javax.annotation-api:1.3.2"
|
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
|
||||||
implementation("javax.annotation:javax.annotation-api:1.3.2")
|
mappings loom.layered() {
|
||||||
runtimeOnly "javax.annotation:javax.annotation-api:1.3.2"
|
// Mojmap mappings
|
||||||
compileOnly "javax.annotation:javax.annotation-api:1.3.2"
|
officialMojangMappings()
|
||||||
modImplementation "javax.annotation:javax.annotation-api:1.3.2"
|
// Parchment mappings (it adds parameter mappings & javadoc)
|
||||||
|
parchment("org.parchmentmc.data:parchment-${rootProject.parchment_version}@zip")
|
||||||
|
}
|
||||||
|
// Fabric loader
|
||||||
|
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
|
||||||
|
|
||||||
|
|
||||||
|
// annotationProcessor "javax.annotation:javax.annotation-api:1.3.2"
|
||||||
|
// implementation("javax.annotation:javax.annotation-api:1.3.2")
|
||||||
|
// runtimeOnly "javax.annotation:javax.annotation-api:1.3.2"
|
||||||
|
// compileOnly "javax.annotation:javax.annotation-api:1.3.2"
|
||||||
|
// modImplementation "javax.annotation:javax.annotation-api:1.3.2"
|
||||||
|
|
||||||
// Fabric API
|
// Fabric API
|
||||||
addModJar_(fabricApi.fabricModule("fabric-api-base", rootProject.fabric_api_version))
|
addModJar(fabricApi.module("fabric-api-base", rootProject.fabric_api_version))
|
||||||
addModJar_(fabricApi.fabricModule("fabric-lifecycle-events-v1", rootProject.fabric_api_version))
|
addModJar(fabricApi.module("fabric-lifecycle-events-v1", rootProject.fabric_api_version))
|
||||||
addModJar_(fabricApi.fabricModule("fabric-resource-loader-v0", rootProject.fabric_api_version))
|
addModJar(fabricApi.module("fabric-resource-loader-v0", rootProject.fabric_api_version))
|
||||||
addModJar_(fabricApi.fabricModule("fabric-events-interaction-v0", rootProject.fabric_api_version))
|
addModJar(fabricApi.module("fabric-events-interaction-v0", rootProject.fabric_api_version))
|
||||||
addModJar_(fabricApi.fabricModule("fabric-rendering-v1", rootProject.fabric_api_version)) // TODO: Remove this as it is only needed in 1 line (FabricClientProxy)
|
addModJar(fabricApi.module("fabric-rendering-v1", rootProject.fabric_api_version)) // TODO: Remove this as it is only needed in 1 line (FabricClientProxy)
|
||||||
addModJar_(fabricApi.fabricModule("fabric-networking-api-v1", rootProject.fabric_api_version))
|
addModJar(fabricApi.module("fabric-networking-api-v1", rootProject.fabric_api_version))
|
||||||
|
|
||||||
|
// used by mod menu in MC 1.20.6+
|
||||||
|
addModJar(fabricApi.module("fabric-screen-api-v1", rootProject.fabric_api_version))
|
||||||
|
addModJar(fabricApi.module("fabric-key-binding-api-v1", rootProject.fabric_api_version))
|
||||||
|
|
||||||
|
|
||||||
// Mod Menu
|
// Mod Menu
|
||||||
modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}")
|
modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Starlight
|
// Starlight
|
||||||
addMod("curse.maven:starlight-521783:${rootProject.starlight_version_fabric}", rootProject.enable_starlight)
|
addMod("curse.maven:starlight-521783:${rootProject.starlight_version_fabric}", rootProject.enable_starlight)
|
||||||
|
|
||||||
@@ -77,8 +105,9 @@ dependencies {
|
|||||||
addMod("io.vram:canvas-fabric-${project.canvas_version}", rootProject.enable_canvas)
|
addMod("io.vram:canvas-fabric-${project.canvas_version}", rootProject.enable_canvas)
|
||||||
|
|
||||||
// Immersive Portals
|
// Immersive Portals
|
||||||
if (rootProject.enable_immersive_portals == "1")
|
if (rootProject.enable_immersive_portals == "1") {
|
||||||
modCompileOnly ("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${project.immersive_portals_version}")
|
modCompileOnly("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${project.immersive_portals_version}")
|
||||||
|
}
|
||||||
else if (rootProject.enable_immersive_portals == "2") {
|
else if (rootProject.enable_immersive_portals == "2") {
|
||||||
modImplementation ("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${project.immersive_portals_version}") {
|
modImplementation ("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${project.immersive_portals_version}") {
|
||||||
exclude(group: "net.fabricmc.fabric-api")
|
exclude(group: "net.fabricmc.fabric-api")
|
||||||
@@ -98,12 +127,6 @@ dependencies {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remapJar {
|
|
||||||
inputFile = shadowJar.archiveFile
|
|
||||||
dependsOn shadowJar
|
|
||||||
// classifier null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
task deleteResources(type: Delete) {
|
task deleteResources(type: Delete) {
|
||||||
delete file("build/resources/main")
|
delete file("build/resources/main")
|
||||||
@@ -114,31 +137,16 @@ processResources {
|
|||||||
dependsOn(copyCommonLoaderResources)
|
dependsOn(copyCommonLoaderResources)
|
||||||
}
|
}
|
||||||
|
|
||||||
afterEvaluate {
|
runClient {
|
||||||
runClient {
|
dependsOn(copyCoreResources)
|
||||||
dependsOn(copyCoreResources)
|
dependsOn(copyCommonLoaderResources)
|
||||||
dependsOn(copyCommonLoaderResources)
|
|
||||||
// jvmArgs([ "-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg ])
|
// jvmArgs([ "-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg ])
|
||||||
finalizedBy(deleteResources)
|
finalizedBy(deleteResources)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//jar {
|
|
||||||
// classifier "dev"
|
|
||||||
//}
|
|
||||||
|
|
||||||
sourcesJar {
|
sourcesJar {
|
||||||
def commonSources = project(":common").sourcesJar
|
def commonSources = project(":common").sourcesJar
|
||||||
dependsOn commonSources
|
dependsOn commonSources
|
||||||
from commonSources.archiveFile.map { zipTree(it) }
|
from commonSources.archiveFile.map { zipTree(it) }
|
||||||
|
|
||||||
// def fabricLikeSources = project(":fabricLike").sourcesJar
|
|
||||||
// dependsOn fabricLikeSources
|
|
||||||
// from fabricLikeSources.archiveFile.map { zipTree(it) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//components.java {
|
|
||||||
// withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
|
|
||||||
// skip()
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
@@ -19,8 +19,9 @@
|
|||||||
|
|
||||||
package com.seibel.distanthorizons.fabric;
|
package com.seibel.distanthorizons.fabric;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
import com.seibel.distanthorizons.common.AbstractModInitializer;
|
import com.seibel.distanthorizons.common.AbstractModInitializer;
|
||||||
import com.seibel.distanthorizons.common.rendering.SeamlessOverdraw;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
||||||
import com.seibel.distanthorizons.core.api.internal.ClientApi;
|
import com.seibel.distanthorizons.core.api.internal.ClientApi;
|
||||||
@@ -37,6 +38,7 @@ import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
|||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
||||||
|
import com.seibel.distanthorizons.coreapi.util.math.Mat4f;
|
||||||
import com.seibel.distanthorizons.fabric.wrappers.modAccessor.SodiumAccessor;
|
import com.seibel.distanthorizons.fabric.wrappers.modAccessor.SodiumAccessor;
|
||||||
//import io.netty.buffer.ByteBuf;
|
//import io.netty.buffer.ByteBuf;
|
||||||
import net.fabricmc.api.EnvType;
|
import net.fabricmc.api.EnvType;
|
||||||
@@ -59,6 +61,7 @@ import net.minecraft.world.InteractionResult;
|
|||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.phys.HitResult;
|
import net.minecraft.world.phys.HitResult;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.joml.Matrix4f;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -131,7 +134,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
ChunkAccess chunk = level.getChunk(blockPos);
|
ChunkAccess chunk = level.getChunk(blockPos);
|
||||||
if (chunk != null)
|
if (chunk != null)
|
||||||
{
|
{
|
||||||
LOGGER.trace("attack block at blockPos: " + blockPos);
|
//LOGGER.trace("attack block at blockPos: " + blockPos);
|
||||||
|
|
||||||
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level);
|
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level);
|
||||||
SharedApi.INSTANCE.chunkBlockChangedEvent(
|
SharedApi.INSTANCE.chunkBlockChangedEvent(
|
||||||
@@ -161,7 +164,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
ChunkAccess chunk = level.getChunk(hitResult.getBlockPos());
|
ChunkAccess chunk = level.getChunk(hitResult.getBlockPos());
|
||||||
if (chunk != null)
|
if (chunk != null)
|
||||||
{
|
{
|
||||||
LOGGER.trace("use block at blockPos: " + hitResult.getBlockPos());
|
//LOGGER.trace("use block at blockPos: " + hitResult.getBlockPos());
|
||||||
|
|
||||||
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level);
|
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level);
|
||||||
SharedApi.INSTANCE.chunkBlockChangedEvent(
|
SharedApi.INSTANCE.chunkBlockChangedEvent(
|
||||||
@@ -193,25 +196,19 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
|
|
||||||
WorldRenderEvents.AFTER_SETUP.register((renderContext) ->
|
WorldRenderEvents.AFTER_SETUP.register((renderContext) ->
|
||||||
{
|
{
|
||||||
|
Mat4f projectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix());
|
||||||
|
|
||||||
|
Mat4f modelViewMatrix;
|
||||||
|
#if MC_VER < MC_1_20_6
|
||||||
|
modelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose());
|
||||||
|
#else
|
||||||
|
modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix());
|
||||||
|
#endif
|
||||||
|
|
||||||
this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()),
|
this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()),
|
||||||
McObjectConverter.Convert(renderContext.matrixStack().last().pose()),
|
modelViewMatrix,
|
||||||
McObjectConverter.Convert(renderContext.projectionMatrix()),
|
projectionMatrix,
|
||||||
renderContext.tickDelta());
|
renderContext.tickDelta());
|
||||||
|
|
||||||
|
|
||||||
// experimental proof-of-concept option
|
|
||||||
if (Config.Client.Advanced.Graphics.AdvancedGraphics.seamlessOverdraw.get())
|
|
||||||
{
|
|
||||||
float[] matrixFloatArray = SeamlessOverdraw.overwriteMinecraftNearFarClipPlanes(renderContext.projectionMatrix(), renderContext.tickDelta());
|
|
||||||
|
|
||||||
#if MC_VER == MC_1_16_5
|
|
||||||
SeamlessOverdraw.applyLegacyProjectionMatrix(matrixFloatArray);
|
|
||||||
#elif MC_VER < MC_1_19_4
|
|
||||||
renderContext.projectionMatrix().load(FloatBuffer.wrap(matrixFloatArray));
|
|
||||||
#else
|
|
||||||
renderContext.projectionMatrix().set(matrixFloatArray);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Debug keyboard event
|
// Debug keyboard event
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import com.seibel.distanthorizons.core.config.Config;
|
|||||||
import com.seibel.distanthorizons.core.config.ConfigBase;
|
import com.seibel.distanthorizons.core.config.ConfigBase;
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.*;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.*;
|
||||||
import com.seibel.distanthorizons.coreapi.ModInfo;
|
import com.seibel.distanthorizons.coreapi.ModInfo;
|
||||||
@@ -37,8 +38,10 @@ import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
|||||||
import net.minecraft.commands.CommandSourceStack;
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,6 +53,8 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti
|
|||||||
{
|
{
|
||||||
private static final ResourceLocation INITIAL_PHASE = ResourceLocation.tryParse("distanthorizons:dedicated_server_initial");
|
private static final ResourceLocation INITIAL_PHASE = ResourceLocation.tryParse("distanthorizons:dedicated_server_initial");
|
||||||
|
|
||||||
|
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -72,10 +77,13 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti
|
|||||||
// If sodium is installed Indium is also necessary in order to use the Fabric rendering API
|
// If sodium is installed Indium is also necessary in order to use the Fabric rendering API
|
||||||
if (!modChecker.isModLoaded("indium"))
|
if (!modChecker.isModLoaded("indium"))
|
||||||
{
|
{
|
||||||
// People don't read the crash logs!!!
|
String indiumMissingMessage = ModInfo.READABLE_NAME + " needs Indium to work with Sodium.\nPlease download Indium from https://modrinth.com/mod/indium";
|
||||||
// So, just put a notification, so they hopefully realise what's the problem (and dont just open issues)
|
LOGGER.fatal(indiumMissingMessage);
|
||||||
System.setProperty("java.awt.headless", "false"); // Required to make it work
|
|
||||||
JOptionPane.showMessageDialog(null, ModInfo.READABLE_NAME + " now relies on Indium to work with Sodium.\nPlease download Indium from https://modrinth.com/mod/indium", ModInfo.READABLE_NAME, JOptionPane.INFORMATION_MESSAGE);
|
if (!GraphicsEnvironment.isHeadless())
|
||||||
|
{
|
||||||
|
JOptionPane.showMessageDialog(null, indiumMissingMessage, ModInfo.READABLE_NAME, JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
|
IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
|
||||||
String errorMessage = "loading Distant Horizons. Distant Horizons requires Indium in order to run with Sodium.";
|
String errorMessage = "loading Distant Horizons. Distant Horizons requires Indium in order to run with Sodium.";
|
||||||
|
|||||||
+19
-2
@@ -7,6 +7,7 @@ import net.minecraft.client.multiplayer.ClientLevel;
|
|||||||
import net.minecraft.client.multiplayer.ClientPacketListener;
|
import net.minecraft.client.multiplayer.ClientPacketListener;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
@@ -23,13 +24,29 @@ public class MixinClientPacketListener
|
|||||||
@Shadow
|
@Shadow
|
||||||
private ClientLevel level;
|
private ClientLevel level;
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private ClientLevel previousLevel;
|
||||||
|
|
||||||
|
|
||||||
@Inject(method = "handleLogin", at = @At("RETURN"))
|
@Inject(method = "handleLogin", at = @At("RETURN"))
|
||||||
void onHandleLoginEnd(CallbackInfo ci) { ClientApi.INSTANCE.onClientOnlyConnected(); }
|
void onHandleLoginEnd(CallbackInfo ci) { ClientApi.INSTANCE.onClientOnlyConnected(); }
|
||||||
|
|
||||||
@Inject(method = "handleRespawn", at = @At("HEAD"))
|
@Inject(method = "handleRespawn", at = @At("HEAD"))
|
||||||
void onHandleRespawnStart(CallbackInfo ci) { ClientApi.INSTANCE.clientLevelUnloadEvent(ClientLevelWrapper.getWrapper(this.level)); }
|
void onHandleRespawnStart(CallbackInfo ci) { this.previousLevel = this.level; }
|
||||||
@Inject(method = "handleRespawn", at = @At("RETURN"))
|
@Inject(method = "handleRespawn", at = @At("RETURN"))
|
||||||
void onHandleRespawnEnd(CallbackInfo ci) { ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level)); }
|
void onHandleRespawnEnd(CallbackInfo ci)
|
||||||
|
{
|
||||||
|
// If the player changes dimensions the "this.level" will be changed halfway through the respawn method.
|
||||||
|
// By checking if the object references are the same, we can see if the previous level should be unloaded
|
||||||
|
// or if the player just respawned in the same level.
|
||||||
|
if (this.previousLevel != this.level)
|
||||||
|
{
|
||||||
|
ClientApi.INSTANCE.clientLevelUnloadEvent(ClientLevelWrapper.getWrapper(this.previousLevel));
|
||||||
|
ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.previousLevel = null;
|
||||||
|
}
|
||||||
|
|
||||||
#if MC_VER < MC_1_19_4
|
#if MC_VER < MC_1_19_4
|
||||||
@Inject(method = "cleanup", at = @At("HEAD"))
|
@Inject(method = "cleanup", at = @At("HEAD"))
|
||||||
|
|||||||
-69
@@ -1,69 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.fabric.mixins.client;
|
|
||||||
|
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
|
||||||
import com.seibel.distanthorizons.common.util.ILightTextureMarker;
|
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(DynamicTexture.class)
|
|
||||||
public class MixinDynamicTexture implements ILightTextureMarker
|
|
||||||
{
|
|
||||||
/** Used to prevent accidentally using other dynamic textures as a lightmap */
|
|
||||||
@Unique
|
|
||||||
private boolean isLightTexture = false;
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
@Final
|
|
||||||
private NativeImage pixels;
|
|
||||||
|
|
||||||
@Inject(method = "upload()V", at = @At("HEAD"))
|
|
||||||
public void updateLightTexture(CallbackInfo ci)
|
|
||||||
{
|
|
||||||
// since the light map is always updated on the client render thread we should be able to access the client level at the same time
|
|
||||||
IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
|
|
||||||
if (!this.isLightTexture
|
|
||||||
|| mc == null
|
|
||||||
|| mc.getWrappedClientLevel() == null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//ApiShared.LOGGER.info("Lightmap update");
|
|
||||||
IClientLevelWrapper clientLevel = mc.getWrappedClientLevel();
|
|
||||||
MinecraftRenderWrapper.INSTANCE.updateLightmap(this.pixels, clientLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void markLightTexture() { this.isLightTexture = true; }
|
|
||||||
|
|
||||||
}
|
|
||||||
+16
-3
@@ -84,11 +84,16 @@ public class MixinLevelRenderer
|
|||||||
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback)
|
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback)
|
||||||
#else
|
#elif MC_VER < MC_1_20_6
|
||||||
@Inject(at = @At("HEAD"),
|
@Inject(at = @At("HEAD"),
|
||||||
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
|
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
|
||||||
|
#else
|
||||||
|
@Inject(at = @At("HEAD"),
|
||||||
|
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V",
|
||||||
|
cancellable = true)
|
||||||
|
private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#if MC_VER == MC_1_16_5
|
#if MC_VER == MC_1_16_5
|
||||||
@@ -100,10 +105,15 @@ public class MixinLevelRenderer
|
|||||||
|
|
||||||
Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose());
|
Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose());
|
||||||
|
|
||||||
#else
|
#elif MC_VER <= MC_1_20_4
|
||||||
// get the matrices directly from MC
|
// get the matrices directly from MC
|
||||||
Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
|
Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
|
||||||
Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
|
Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
|
||||||
|
#else
|
||||||
|
// get the matrices directly from MC
|
||||||
|
Mat4f mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix);
|
||||||
|
Mat4f mcProjectionMatrix = new Mat4f();
|
||||||
|
mcProjectionMatrix.setIdentity();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (renderType.equals(RenderType.translucent())) {
|
if (renderType.equals(RenderType.translucent())) {
|
||||||
@@ -126,9 +136,12 @@ public class MixinLevelRenderer
|
|||||||
#elif MC_VER < MC_1_20_1
|
#elif MC_VER < MC_1_20_1
|
||||||
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
|
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
|
||||||
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
|
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
|
||||||
#else
|
#elif MC_VER < MC_1_20_6
|
||||||
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
|
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
|
||||||
private void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
|
private void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
|
||||||
|
#else
|
||||||
|
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
|
||||||
|
private void callAfterRunUpdates(CallbackInfo ci)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
ChunkWrapper.syncedUpdateClientLightStatus();
|
ChunkWrapper.syncedUpdateClientLightStatus();
|
||||||
|
|||||||
+19
-7
@@ -20,9 +20,14 @@
|
|||||||
package com.seibel.distanthorizons.fabric.mixins.client;
|
package com.seibel.distanthorizons.fabric.mixins.client;
|
||||||
|
|
||||||
|
|
||||||
import com.seibel.distanthorizons.common.util.ILightTextureMarker;
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
|
|
||||||
|
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
|
||||||
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
|
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
||||||
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
||||||
import net.minecraft.client.renderer.LightTexture;
|
import net.minecraft.client.renderer.LightTexture;
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@@ -35,13 +40,20 @@ public class MixinLightTexture
|
|||||||
{
|
{
|
||||||
@Shadow
|
@Shadow
|
||||||
@Final
|
@Final
|
||||||
private DynamicTexture lightTexture;
|
private NativeImage lightPixels;
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
public void markLightTexture(CallbackInfo ci)
|
@Inject(method = "updateLightTexture(F)V", at = @At("RETURN"))
|
||||||
|
public void updateLightTexture(float partialTicks, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
//
|
IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
|
||||||
((ILightTextureMarker) this.lightTexture).markLightTexture();
|
if (mc == null || mc.getWrappedClientLevel() == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IClientLevelWrapper clientLevel = mc.getWrappedClientLevel();
|
||||||
|
MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-9
@@ -1,6 +1,6 @@
|
|||||||
package com.seibel.distanthorizons.fabric.mixins.client;
|
package com.seibel.distanthorizons.fabric.mixins.client;
|
||||||
|
|
||||||
import com.seibel.distanthorizons.api.enums.config.EUpdateBranch;
|
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
|
||||||
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
|
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
|
||||||
import com.seibel.distanthorizons.core.config.Config;
|
import com.seibel.distanthorizons.core.config.Config;
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
@@ -8,10 +8,11 @@ import com.seibel.distanthorizons.core.jar.installer.GitlabGetter;
|
|||||||
import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter;
|
import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter;
|
||||||
import com.seibel.distanthorizons.core.jar.updater.SelfUpdater;
|
import com.seibel.distanthorizons.core.jar.updater.SelfUpdater;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants;
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.client.gui.screens.Screen;
|
import net.minecraft.client.gui.screens.Screen;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.screens.TitleScreen;
|
import net.minecraft.client.gui.screens.TitleScreen;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@@ -25,6 +26,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
@Mixin(Minecraft.class)
|
@Mixin(Minecraft.class)
|
||||||
public class MixinMinecraft
|
public class MixinMinecraft
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Can be enabled for testing the auto updater UI. <br/>
|
||||||
|
* will always show the auto updater if set to true.
|
||||||
|
*/
|
||||||
|
@Unique
|
||||||
|
private static final boolean DEBUG_ALWAYS_SHOW_UPDATER = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if MC_VER < MC_1_20_2
|
#if MC_VER < MC_1_20_2
|
||||||
#if MC_VER == MC_1_20_1
|
#if MC_VER == MC_1_20_1
|
||||||
@Redirect(
|
@Redirect(
|
||||||
@@ -41,17 +51,17 @@ public class MixinMinecraft
|
|||||||
public void onOpenScreen(Minecraft instance, Screen guiScreen)
|
public void onOpenScreen(Minecraft instance, Screen guiScreen)
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
if (!Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get()) // Don't do anything if the user doesn't want it
|
if (!Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() && !DEBUG_ALWAYS_SHOW_UPDATER) // Don't do anything if the user doesn't want it
|
||||||
{
|
{
|
||||||
instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened
|
instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SelfUpdater.onStart())
|
if (SelfUpdater.onStart() || DEBUG_ALWAYS_SHOW_UPDATER)
|
||||||
{
|
{
|
||||||
instance.setScreen(new UpdateModScreen(
|
instance.setScreen(new UpdateModScreen(
|
||||||
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
||||||
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()): GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EDhApiUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()): GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -69,15 +79,21 @@ public class MixinMinecraft
|
|||||||
private void buildInitialScreens(Runnable runnable)
|
private void buildInitialScreens(Runnable runnable)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() // Don't do anything if the user doesn't want it
|
DEBUG_ALWAYS_SHOW_UPDATER ||
|
||||||
&& SelfUpdater.onStart()
|
(
|
||||||
)
|
// Don't do anything if the user doesn't want it
|
||||||
|
Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get()
|
||||||
|
&& SelfUpdater.onStart()
|
||||||
|
)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
runnable = () -> {
|
runnable = () -> {
|
||||||
Minecraft.getInstance().setScreen(new UpdateModScreen(
|
Minecraft.getInstance().setScreen(new UpdateModScreen(
|
||||||
// TODO: Change to runnable, instead of tittle screen
|
// TODO: Change to runnable, instead of tittle screen
|
||||||
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
||||||
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()) : GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EDhApiUpdateBranch.STABLE
|
||||||
|
? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion())
|
||||||
|
: GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
+90
-26
@@ -30,52 +30,116 @@ import net.minecraft.network.chat.Component;
|
|||||||
import net.minecraft.network.chat.TranslatableComponent;
|
import net.minecraft.network.chat.TranslatableComponent;
|
||||||
#endif
|
#endif
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
#if MC_VER == MC_1_20_6
|
||||||
|
import net.minecraft.client.gui.layouts.LinearLayout;
|
||||||
|
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a button to the menu to goto the config
|
* Adds a button to the menu to goto the config
|
||||||
*
|
*
|
||||||
* @author coolGi
|
* @author coolGi
|
||||||
* @version 12-02-2021
|
* @version 2024-5-20
|
||||||
*/
|
*/
|
||||||
@Mixin(OptionsScreen.class)
|
@Mixin(OptionsScreen.class)
|
||||||
public class MixinOptionsScreen extends Screen
|
public class MixinOptionsScreen extends Screen
|
||||||
{
|
{
|
||||||
// Get the texture for the button
|
/** Texture used for the config opening button */
|
||||||
|
@Unique
|
||||||
private static final ResourceLocation ICON_TEXTURE = new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
|
private static final ResourceLocation ICON_TEXTURE = new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
|
||||||
protected MixinOptionsScreen(Component title)
|
|
||||||
{
|
|
||||||
super(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(at = @At("HEAD"), method = "init")
|
|
||||||
|
@Unique
|
||||||
|
private TexturedButtonWidget optionsButton = null;
|
||||||
|
|
||||||
|
#if MC_VER == MC_1_20_6
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
protected HeaderAndFooterLayout layout;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//==============//
|
||||||
|
// constructors //
|
||||||
|
//==============//
|
||||||
|
|
||||||
|
protected MixinOptionsScreen(Component title) { super(title); }
|
||||||
|
|
||||||
|
@Inject(at = @At("RETURN"), method = "init")
|
||||||
private void lodconfig$init(CallbackInfo ci)
|
private void lodconfig$init(CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (Config.Client.optionsButton.get())
|
if (Config.Client.optionsButton.get())
|
||||||
this. #if MC_VER < MC_1_17_1 addButton #else addRenderableWidget #endif
|
{
|
||||||
(new TexturedButtonWidget(
|
#if MC_VER < MC_1_17_1
|
||||||
// Where the button is on the screen
|
this.addButton(this.getOptionsButton());
|
||||||
this.width / 2 - 180, this.height / 6 - 12,
|
#elif MC_VER < MC_1_20_6
|
||||||
// Width and height of the button
|
this.addRenderableWidget(this.getOptionsButton());
|
||||||
20, 20,
|
#else
|
||||||
// Offset
|
|
||||||
0, 0,
|
// add the button so it's rendered
|
||||||
// Some textuary stuff
|
this.addRenderableWidget(this.getOptionsButton());
|
||||||
20, ICON_TEXTURE, 20, 40,
|
|
||||||
// Create the button and tell it where to go
|
// add the button to the correct location in the UI
|
||||||
// For now it goes to the client option by default
|
// TODO is there a better way to do this instead of using access transformers to inject into the exact UI elements?
|
||||||
(buttonWidget) -> Objects.requireNonNull(minecraft).setScreen(GetConfigScreen.getScreen(this)),
|
LinearLayout layout = (LinearLayout) this.layout.headerFrame.children.get(0).child;
|
||||||
// Add a title to the utton
|
|
||||||
#if MC_VER < MC_1_19_2
|
// determine how wide the other option buttons are so we can put our botton to the left of them all
|
||||||
new TranslatableComponent(ModInfo.ID + ".title")));
|
AtomicInteger width = new AtomicInteger(0);
|
||||||
#else
|
layout.visitChildren(x -> { width.addAndGet(x.getWidth()); });
|
||||||
Component.translatable(ModInfo.ID + ".title")));
|
width.addAndGet(-10); // padding between the DH button and the FOV slider
|
||||||
#endif
|
|
||||||
|
layout.wrapped.addChild(this.getOptionsButton(), 1, 2, (settings) -> { settings.paddingLeft(width.get() * -1); });
|
||||||
|
layout.arrangeElements();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//================//
|
||||||
|
// helper methods //
|
||||||
|
//================//
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
public TexturedButtonWidget getOptionsButton()
|
||||||
|
{
|
||||||
|
if (this.optionsButton == null)
|
||||||
|
{
|
||||||
|
this.optionsButton
|
||||||
|
= new TexturedButtonWidget(
|
||||||
|
// Where the button is on the screen
|
||||||
|
this.width / 2 - 180, this.height / 6 - 12,
|
||||||
|
// Width and height of the button
|
||||||
|
20, 20,
|
||||||
|
// texture UV Offset
|
||||||
|
0, 0,
|
||||||
|
// Some textuary stuff
|
||||||
|
20, ICON_TEXTURE, 20, 40,
|
||||||
|
// Create the button and tell it where to go
|
||||||
|
// For now it goes to the client option by default
|
||||||
|
(buttonWidget) -> Objects.requireNonNull(this.minecraft).setScreen(GetConfigScreen.getScreen(this)),
|
||||||
|
// Add a title to the button
|
||||||
|
#if MC_VER < MC_1_19_2
|
||||||
|
new TranslatableComponent(ModInfo.ID + ".title"));
|
||||||
|
#else
|
||||||
|
Component.translatable(ModInfo.ID + ".title"));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.optionsButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
-60
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.fabric.mixins.server.unsafe;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
|
|
||||||
//FIXME: Is this still needed?
|
|
||||||
#if MC_VER >= MC_1_18_2
|
|
||||||
|
|
||||||
import net.minecraft.util.ThreadingDetector;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import java.util.concurrent.Semaphore;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Why does this exist? But okay! (Will be probably removed when the experimental generator is done)
|
|
||||||
* FIXME: Recheck this
|
|
||||||
*/
|
|
||||||
@Mixin(ThreadingDetector.class)
|
|
||||||
public class MixinThreadingDetector
|
|
||||||
{
|
|
||||||
@Mutable
|
|
||||||
@Shadow
|
|
||||||
private Semaphore lock;
|
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
private void setSemaphore(CallbackInfo ci)
|
|
||||||
{
|
|
||||||
this.lock = new Semaphore(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
|
|
||||||
import net.minecraft.server.level.ServerLevel;
|
|
||||||
|
|
||||||
@Mixin(ServerLevel.class)
|
|
||||||
public class MixinThreadingDetector { } //FIXME: Is there some way to make this file just not be added?
|
|
||||||
#endif
|
|
||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package com.seibel.distanthorizons.fabric.wrappers.modAccessor;
|
package com.seibel.distanthorizons.fabric.wrappers.modAccessor;
|
||||||
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IBCLibAccessor;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IBCLibAccessor;
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 || MC_VER == MC_1_20_4 // These versions either don't have BCLib, or the implementation is different
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 || MC_VER == MC_1_20_4 || MC_VER == MC_1_20_6 // These versions either don't have BCLib, or the implementation is different
|
||||||
#elif MC_VER == MC_1_18_2
|
#elif MC_VER == MC_1_18_2
|
||||||
import ru.bclib.config.ClientConfig;
|
import ru.bclib.config.ClientConfig;
|
||||||
import ru.bclib.config.Configs;
|
import ru.bclib.config.Configs;
|
||||||
@@ -17,7 +17,7 @@ public class BCLibAccessor implements IBCLibAccessor
|
|||||||
|
|
||||||
public void setRenderCustomFog(boolean newValue)
|
public void setRenderCustomFog(boolean newValue)
|
||||||
{
|
{
|
||||||
#if !(MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 || MC_VER == MC_1_20_4) // These versions either don't have BCLib, or the implementation is different
|
#if !(MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 || MC_VER == MC_1_20_4 || MC_VER == MC_1_20_6) // These versions either don't have BCLib, or the implementation is different
|
||||||
|
|
||||||
// Change the value of CUSTOM_FOG_RENDERING in the bclib client config
|
// Change the value of CUSTOM_FOG_RENDERING in the bclib client config
|
||||||
// This disabled fog from rendering within bclib
|
// This disabled fog from rendering within bclib
|
||||||
|
|||||||
+4
@@ -22,7 +22,11 @@ package com.seibel.distanthorizons.fabric.wrappers.modAccessor;
|
|||||||
#if MC_VER >= MC_1_19_4
|
#if MC_VER >= MC_1_19_4
|
||||||
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IIrisAccessor;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IIrisAccessor;
|
||||||
|
#if MC_VER <= MC_1_20_4
|
||||||
import net.coderbot.iris.Iris;
|
import net.coderbot.iris.Iris;
|
||||||
|
#else
|
||||||
|
import net.irisshaders.iris.Iris;
|
||||||
|
#endif
|
||||||
import net.irisshaders.iris.api.v0.IrisApi;
|
import net.irisshaders.iris.api.v0.IrisApi;
|
||||||
|
|
||||||
public class IrisAccessor implements IIrisAccessor
|
public class IrisAccessor implements IIrisAccessor
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
"minVersion": "0.8",
|
"minVersion": "0.8",
|
||||||
"package": "com.seibel.distanthorizons.fabric.mixins",
|
"package": "com.seibel.distanthorizons.fabric.mixins",
|
||||||
"mixins": [
|
"mixins": [
|
||||||
"server.unsafe.MixinThreadingDetector",
|
|
||||||
"server.MixinChunkGenerator",
|
"server.MixinChunkGenerator",
|
||||||
"server.MixinChunkMap",
|
"server.MixinChunkMap",
|
||||||
"server.MixinUtilBackgroundThread"
|
"server.MixinUtilBackgroundThread"
|
||||||
@@ -15,7 +14,6 @@
|
|||||||
"client.MixinFogRenderer",
|
"client.MixinFogRenderer",
|
||||||
"client.MixinGameRenderer",
|
"client.MixinGameRenderer",
|
||||||
"client.MixinLevelRenderer",
|
"client.MixinLevelRenderer",
|
||||||
"client.MixinDynamicTexture",
|
|
||||||
"client.MixinLightTexture",
|
"client.MixinLightTexture",
|
||||||
"client.MixinOptionsScreen",
|
"client.MixinOptionsScreen",
|
||||||
"client.MixinMinecraft",
|
"client.MixinMinecraft",
|
||||||
|
|||||||
+83
-86
@@ -1,44 +1,99 @@
|
|||||||
unimined.minecraft {
|
plugins {
|
||||||
minecraftForge {
|
// Note: This is only needed for multi-loader projects
|
||||||
loader forge_version
|
// The main architectury loom version is set at the start of the root build.gradle
|
||||||
mixinConfig("DistantHorizons.forge.mixins.json")
|
id "architectury-plugin" version "3.4-SNAPSHOT"
|
||||||
|
}
|
||||||
|
|
||||||
file("build/sourcesSets/main/META-INF/").mkdirs()
|
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_21
|
||||||
accessTransformer(aw2at(
|
|
||||||
project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener"),
|
architectury {
|
||||||
file("build/sourcesSets/main/META-INF/accesstransformer.cfg") // We'd wanna output the access transformer to somewhere where it'll only appear in the final jar
|
platformSetupLoomIde()
|
||||||
))
|
forge()
|
||||||
|
}
|
||||||
|
|
||||||
|
//loom {
|
||||||
|
// forge {
|
||||||
|
// convertAccessWideners.set(true)
|
||||||
|
// extraAccessWideners.add("lod.accesswidener")
|
||||||
|
// mixinConfigs("DistantHorizons.mixins.json")
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
loom {
|
||||||
|
silentMojangMappingsLicense() // Shut the licencing warning
|
||||||
|
accessWidenerPath = project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
|
||||||
|
|
||||||
|
forge {
|
||||||
|
convertAccessWideners = true
|
||||||
|
extraAccessWideners.add loom.accessWidenerPath.get().asFile.name
|
||||||
|
|
||||||
|
mixinConfigs = [
|
||||||
|
"DistantHorizons.forge.mixins.json"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
// "runs" isn't required, but when we do need it then it can be useful
|
||||||
|
runs {
|
||||||
|
client {
|
||||||
|
client()
|
||||||
|
setConfigName("Forge Client")
|
||||||
|
ideConfigGenerated(true)
|
||||||
|
runDir("../run")
|
||||||
|
// vmArgs("-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg)
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
server()
|
||||||
|
setConfigName("Forge Server")
|
||||||
|
ideConfigGenerated(true)
|
||||||
|
runDir("../run")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
inputFile = shadowJar.archiveFile
|
||||||
|
dependsOn shadowJar
|
||||||
|
}
|
||||||
|
|
||||||
def addMod(path, enabled) {
|
def addMod(path, enabled) {
|
||||||
if (enabled == "2")
|
if (enabled == "2")
|
||||||
dependencies { modImplementation(path) }
|
dependencies { implementation(path) }
|
||||||
else if (enabled == "1")
|
else if (enabled == "1")
|
||||||
dependencies { compileOnly(path) }
|
dependencies { modCompileOnly(path) }
|
||||||
}
|
}
|
||||||
dependencies {
|
|
||||||
// Architectury API
|
|
||||||
// if (minecraft_version == "1.16.5") {
|
|
||||||
// implementation("me.shedaniel:architectury-forge:${rootProject.architectury_version}")
|
|
||||||
// } else {
|
|
||||||
// implementation("dev.architectury:architectury-forge:${rootProject.architectury_version}")
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Starlight
|
dependencies {
|
||||||
addMod("curse.maven:starlight-forge-526854:${rootProject.starlight_version_forge}", rootProject.enable_starlight_forge)
|
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
|
||||||
// annotationProcessor "org.spongepowered:mixin:0.8.4:processor"
|
mappings loom.layered() {
|
||||||
|
// Mojmap mappings
|
||||||
|
officialMojangMappings()
|
||||||
|
// Parchment mappings (it adds parameter mappings & javadoc)
|
||||||
|
parchment("org.parchmentmc.data:parchment-${rootProject.parchment_version}@zip")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forge
|
||||||
|
forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}"
|
||||||
|
|
||||||
addMod("curse.maven:TerraForged-363820:${rootProject.terraforged_version}", rootProject.enable_terraforged)
|
addMod("curse.maven:TerraForged-363820:${rootProject.terraforged_version}", rootProject.enable_terraforged)
|
||||||
|
|
||||||
addMod("curse.maven:TerraFirmaCraft-302973:4616004", rootProject.enable_terrafirmacraft)
|
addMod("curse.maven:TerraFirmaCraft-302973:4616004", rootProject.enable_terrafirmacraft)
|
||||||
|
|
||||||
// annotationProcessor "org.spongepowered:mixin:0.8.5:processor"
|
|
||||||
|
|
||||||
// if (System.getProperty("idea.sync.active") != "true") {
|
if ( // Only run on MC 1.20.6 or later
|
||||||
// annotationProcessor "org.spongepowered:mixin:0.8.4:processor"
|
// FIXME: Add an environment variable for the Major, Minor, and Patch version number of Minecraft
|
||||||
// }
|
minecraft_version.split("\\.")[1].toInteger() >= 20 &&
|
||||||
|
(
|
||||||
|
minecraft_version.split("\\.").length > 1 && // Incase there isn't a minor version
|
||||||
|
minecraft_version.split("\\.")[2].toInteger() >= 6
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
// (potential) hack fix, force jopt-simple to be exactly 5.0.4 because Mojang ships that version, but some transitive dependencies request 6.0+
|
||||||
|
implementation('net.sf.jopt-simple:jopt-simple:5.0.4') //{ version { strictly '5.0.4' } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task deleteResources(type: Delete) {
|
||||||
|
delete file("build/resources/main")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('copyAllResources') {
|
tasks.register('copyAllResources') {
|
||||||
@@ -46,70 +101,12 @@ tasks.register('copyAllResources') {
|
|||||||
dependsOn(copyCommonLoaderResources)
|
dependsOn(copyCommonLoaderResources)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
dependsOn(tasks.named('copyAllResources'))
|
dependsOn(tasks.named('copyAllResources'))
|
||||||
}
|
}
|
||||||
|
|
||||||
afterEvaluate {
|
tasks.named('runClient') {
|
||||||
runClient {
|
dependsOn(tasks.named('copyAllResources'))
|
||||||
dependsOn(tasks.named('copyAllResources'))
|
finalizedBy(deleteResources)
|
||||||
}
|
|
||||||
|
|
||||||
// TODO this isn't a great place for these, but `tasks.build.doLast` doesn't always work and I'm not sure of a better place right now
|
|
||||||
tasks.runClient.doFirst {
|
|
||||||
// TODO can we just ignore these folders instead?
|
|
||||||
// deleting them may cause issues if the OS locks the files
|
|
||||||
// and it feels hacky
|
|
||||||
delete file("../common/build/libs")
|
|
||||||
delete file("../coreSubProjects/core/build/libs")
|
|
||||||
delete file("../coreSubProjects/api/build/libs")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remapJar {
|
|
||||||
inputFile = shadowJar.archiveFile
|
|
||||||
dependsOn shadowJar
|
|
||||||
// classifier null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sourcesJar {
|
|
||||||
def commonSources = project(":common").sourcesJar
|
|
||||||
dependsOn commonSources
|
|
||||||
from commonSources.archiveFile.map { zipTree(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
//components.java {
|
|
||||||
// withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
|
|
||||||
// skip()
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TODO this was specifically added for MC 1.20.4 and should not be used on MC versions prior to it
|
|
||||||
// source: https://github.com/MinecraftForge/MinecraftForge/blob/5d0047753dfac0caaf5d97cc3f5c9a8b0990cb44/mdk/build.gradle#L209-L217
|
|
||||||
//
|
|
||||||
// Merge the resources and classes into the same directory.
|
|
||||||
// This is done because java expects modules to be in a single directory.
|
|
||||||
// And if we have it in multiple we have to do performance intensive hacks like having the UnionFileSystem
|
|
||||||
// This will eventually be migrated to ForgeGradle so modders don't need to manually do it. But that is later.
|
|
||||||
sourceSets.each {
|
|
||||||
if ( // Only run on MC 1.20.4 or later
|
|
||||||
// FIXME: Add an environment variable for the Major, Minor, and Patch version number of Minecraft
|
|
||||||
minecraft_version.split("\\.")[1].toInteger() >= 20 &&
|
|
||||||
(
|
|
||||||
minecraft_version.split("\\.").length > 1 && // Incase there isn't a minor version
|
|
||||||
minecraft_version.split("\\.")[2].toInteger() >= 4
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
// all of our code and resources should be in the sourceSets/main/ folder for Forge 1.20.4+
|
|
||||||
def dir = layout.buildDirectory.dir("sourcesSets/$it.name")
|
|
||||||
println "source name: [" + it.name + "]"// as of 2024-2-4 "it.name" only returned "main" and "test"
|
|
||||||
it.output.resourcesDir = dir
|
|
||||||
it.java.destinationDirectory = dir
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
|
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
|
||||||
|
|
||||||
#if MC_VER < MC_1_19_2
|
#if MC_VER < MC_1_19_2
|
||||||
LevelAccessor level = event.getWorld();
|
LevelAccessor level = event.getWorld();
|
||||||
@@ -197,7 +197,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.trace("break or block attack at blockPos: " + event.getPos());
|
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
|
||||||
|
|
||||||
#if MC_VER < MC_1_19_2
|
#if MC_VER < MC_1_19_2
|
||||||
LevelAccessor level = event.getWorld();
|
LevelAccessor level = event.getWorld();
|
||||||
@@ -328,9 +328,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
#elif MC_VER >= MC_1_18_2
|
#elif MC_VER >= MC_1_18_2
|
||||||
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_SOLID_BLOCKS)
|
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_SOLID_BLOCKS)
|
||||||
#else
|
#else
|
||||||
// FIXME: Is this the correct location for 1.16 & 1.17???
|
if (event.type.equals(TickEvent.RenderTickEvent.Type.RENDER))
|
||||||
// I couldnt find anything for rendering after the level, so is rendering after overlays ok?
|
|
||||||
if (event.type.equals(TickEvent.RenderTickEvent.Type.WORLD))
|
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ import java.util.function.Consumer;
|
|||||||
* If you are looking for the real start of the mod
|
* If you are looking for the real start of the mod
|
||||||
* check out the ClientProxy.
|
* check out the ClientProxy.
|
||||||
*/
|
*/
|
||||||
@Mod("distanthorizons") // TODO: Change it back to ModInfo.ID when forge works
|
@Mod(ModInfo.ID)
|
||||||
public class ForgeMain extends AbstractModInitializer
|
public class ForgeMain extends AbstractModInitializer
|
||||||
{
|
{
|
||||||
public ForgeMain()
|
public ForgeMain()
|
||||||
|
|||||||
-74
@@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.forge.mixins.client;
|
|
||||||
|
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
|
||||||
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
|
||||||
import com.seibel.distanthorizons.common.util.ILightTextureMarker;
|
|
||||||
|
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
@Mixin(DynamicTexture.class)
|
|
||||||
public abstract class MixinDynamicTexture implements ILightTextureMarker
|
|
||||||
{
|
|
||||||
/** Used to prevent accidentally using other dynamic textures as a lightmap */
|
|
||||||
@Unique
|
|
||||||
private boolean isLightTexture = false;
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
@Final
|
|
||||||
private NativeImage pixels;
|
|
||||||
|
|
||||||
@Inject(method = "upload()V", at = @At("HEAD"))
|
|
||||||
public void updateLightTexture(CallbackInfo ci)
|
|
||||||
{
|
|
||||||
// since the light map is always updated on the client render thread we should be able to access the client level at the same time
|
|
||||||
IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
|
|
||||||
if (!this.isLightTexture
|
|
||||||
|| mc == null
|
|
||||||
|| mc.getWrappedClientLevel() == null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//ApiShared.LOGGER.info("Lightmap update");
|
|
||||||
IClientLevelWrapper clientLevel = mc.getWrappedClientLevel();
|
|
||||||
MinecraftRenderWrapper.INSTANCE.updateLightmap(this.pixels, clientLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void markLightTexture() { this.isLightTexture = true; }
|
|
||||||
|
|
||||||
}
|
|
||||||
+9
-17
@@ -29,7 +29,6 @@ import net.minecraft.client.renderer.GameRenderer;
|
|||||||
import net.minecraft.client.renderer.LightTexture;
|
import net.minecraft.client.renderer.LightTexture;
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
#endif
|
#endif
|
||||||
import com.seibel.distanthorizons.common.rendering.SeamlessOverdraw;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
||||||
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
||||||
@@ -50,6 +49,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.nio.FloatBuffer;
|
import java.nio.FloatBuffer;
|
||||||
|
|
||||||
#if MC_VER < MC_1_17_1
|
#if MC_VER < MC_1_17_1
|
||||||
@@ -69,7 +69,8 @@ import org.lwjgl.opengl.GL15;
|
|||||||
@Mixin(LevelRenderer.class)
|
@Mixin(LevelRenderer.class)
|
||||||
public class MixinLevelRenderer
|
public class MixinLevelRenderer
|
||||||
{
|
{
|
||||||
@Shadow
|
@Nullable
|
||||||
|
@Shadow //# if MC_VER >= MC_1_20_4 (remap = false) # endif
|
||||||
private ClientLevel level;
|
private ClientLevel level;
|
||||||
@Unique
|
@Unique
|
||||||
private static float previousPartialTicks = 0;
|
private static float previousPartialTicks = 0;
|
||||||
@@ -112,11 +113,16 @@ public class MixinLevelRenderer
|
|||||||
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback)
|
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback)
|
||||||
#else
|
#elif MC_VER < MC_1_20_4
|
||||||
@Inject(at = @At("HEAD"),
|
@Inject(at = @At("HEAD"),
|
||||||
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
|
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
|
||||||
|
#else
|
||||||
|
@Inject(at = @At("HEAD"),
|
||||||
|
method = "renderSectionLayer",
|
||||||
|
cancellable = true)
|
||||||
|
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
// get MC's model view and projection matrices
|
// get MC's model view and projection matrices
|
||||||
@@ -141,20 +147,6 @@ public class MixinLevelRenderer
|
|||||||
if (renderType.equals(RenderType.solid()))
|
if (renderType.equals(RenderType.solid()))
|
||||||
{
|
{
|
||||||
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, Minecraft.getInstance().getFrameTime());
|
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, Minecraft.getInstance().getFrameTime());
|
||||||
|
|
||||||
// experimental proof-of-concept option
|
|
||||||
if (Config.Client.Advanced.Graphics.AdvancedGraphics.seamlessOverdraw.get())
|
|
||||||
{
|
|
||||||
float[] matrixFloatArray = SeamlessOverdraw.overwriteMinecraftNearFarClipPlanes(mcProjectionMatrix, previousPartialTicks);
|
|
||||||
|
|
||||||
#if MC_VER == MC_1_16_5
|
|
||||||
SeamlessOverdraw.applyLegacyProjectionMatrix(matrixFloatArray);
|
|
||||||
#elif MC_VER < MC_1_19_4
|
|
||||||
projectionMatrix.load(FloatBuffer.wrap(matrixFloatArray));
|
|
||||||
#else
|
|
||||||
projectionMatrix.set(matrixFloatArray);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (renderType.equals(RenderType.translucent()))
|
else if (renderType.equals(RenderType.translucent()))
|
||||||
{
|
{
|
||||||
|
|||||||
+20
-6
@@ -20,10 +20,13 @@
|
|||||||
package com.seibel.distanthorizons.forge.mixins.client;
|
package com.seibel.distanthorizons.forge.mixins.client;
|
||||||
|
|
||||||
|
|
||||||
import com.seibel.distanthorizons.common.util.ILightTextureMarker;
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
|
|
||||||
|
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
|
||||||
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
|
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
||||||
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
||||||
import net.minecraft.client.renderer.LightTexture;
|
import net.minecraft.client.renderer.LightTexture;
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -35,11 +38,22 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
@Mixin(LightTexture.class)
|
@Mixin(LightTexture.class)
|
||||||
public class MixinLightTexture
|
public class MixinLightTexture
|
||||||
{
|
{
|
||||||
@Shadow
|
@Shadow //# if MC_VER >= MC_1_20_4 (remap = false) # endif
|
||||||
@Final
|
@Final
|
||||||
private DynamicTexture lightTexture;
|
private NativeImage lightPixels;
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
public void markLightTexture(CallbackInfo ci) { ((ILightTextureMarker) this.lightTexture).markLightTexture(); }
|
@Inject(method = "updateLightTexture(F)V", at = @At("RETURN"))
|
||||||
|
public void updateLightTexture(float partialTicks, CallbackInfo ci)
|
||||||
|
{
|
||||||
|
IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
|
||||||
|
if (mc == null || mc.getWrappedClientLevel() == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IClientLevelWrapper clientLevel = mc.getWrappedClientLevel();
|
||||||
|
MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
package com.seibel.distanthorizons.forge.mixins.client;
|
package com.seibel.distanthorizons.forge.mixins.client;
|
||||||
|
|
||||||
import com.seibel.distanthorizons.api.enums.config.EUpdateBranch;
|
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
|
||||||
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
|
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
|
||||||
import com.seibel.distanthorizons.core.config.Config;
|
import com.seibel.distanthorizons.core.config.Config;
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
@@ -51,7 +51,7 @@ public class MixinMinecraft
|
|||||||
{
|
{
|
||||||
instance.setScreen(new UpdateModScreen(
|
instance.setScreen(new UpdateModScreen(
|
||||||
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
||||||
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()): GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EDhApiUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()): GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -77,7 +77,7 @@ public class MixinMinecraft
|
|||||||
Minecraft.getInstance().setScreen(new UpdateModScreen(
|
Minecraft.getInstance().setScreen(new UpdateModScreen(
|
||||||
// TODO: Change to runnable, instead of tittle screen
|
// TODO: Change to runnable, instead of tittle screen
|
||||||
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
||||||
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()) : GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EDhApiUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()) : GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
-156
@@ -1,156 +0,0 @@
|
|||||||
package com.seibel.distanthorizons.forge.mixins.client;
|
|
||||||
|
|
||||||
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiLevelType;
|
|
||||||
import com.seibel.distanthorizons.api.interfaces.world.IDhApiDimensionTypeWrapper;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.DimensionTypeWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.file.structure.LocalSaveStructure;
|
|
||||||
import com.seibel.distanthorizons.core.level.DhServerLevel;
|
|
||||||
import com.seibel.distanthorizons.core.pos.DhBlockPos;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
import net.minecraft.util.worldupdate.WorldUpgrader;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.dimension.DimensionType;
|
|
||||||
import net.minecraft.world.level.dimension.LevelStem;
|
|
||||||
import net.minecraft.world.level.levelgen.WorldGenSettings;
|
|
||||||
import net.minecraft.world.level.storage.DimensionDataStorage;
|
|
||||||
import net.minecraft.world.level.storage.LevelStorageSource;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
|
|
||||||
#if FALSE
|
|
||||||
@Mixin(WorldUpgrader.class)
|
|
||||||
public class MixinWorldUpgrader {
|
|
||||||
static class FakeLevelWrapper implements IServerLevelWrapper {
|
|
||||||
private Path saveFolder;
|
|
||||||
private LevelStem stem;
|
|
||||||
private DimensionType dimension;
|
|
||||||
private DimensionTypeWrapper dimensionTypeWrapper;
|
|
||||||
|
|
||||||
public FakeLevelWrapper(LevelStorageSource.LevelStorageAccess storage, WorldGenSettings gen, ResourceKey<Level> dim) {
|
|
||||||
saveFolder = storage.getDimensionPath(dim);
|
|
||||||
stem = gen.dimensions().getOrThrow(WorldGenSettings.levelToLevelStem(dim));
|
|
||||||
dimension = stem.typeHolder().value();
|
|
||||||
dimensionTypeWrapper = DimensionTypeWrapper.getDimensionTypeWrapper(dimension);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EDhApiLevelType getLevelType() {
|
|
||||||
return EDhApiLevelType.SERVER_LEVEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IDhApiDimensionTypeWrapper getDimensionType() {
|
|
||||||
return dimensionTypeWrapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getBlockLight(int x, int y, int z) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSkyLight(int x, int y, int z) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasCeiling() {
|
|
||||||
return dimension.hasCeiling();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasSkyLight() {
|
|
||||||
return dimension.hasSkyLight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getHeight() {
|
|
||||||
return dimension.height();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMinHeight() {
|
|
||||||
return dimension.minY();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasChunkLoaded(int chunkX, int chunkZ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBlockStateWrapper getBlockState(DhBlockPos pos) {
|
|
||||||
return BlockStateWrapper.AIR;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBiomeWrapper getBiome(DhBlockPos pos) {
|
|
||||||
throw new UnsupportedOperationException("Not implemented yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getWrappedMcObject() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public IClientLevelWrapper tryGetClientLevelWrapper() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public File getSaveFolder() {
|
|
||||||
return saveFolder.toFile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Unique
|
|
||||||
private DhServerLevel dhServerLevel;
|
|
||||||
@Unique
|
|
||||||
private FakeLevelWrapper fakeLevelWrapper;
|
|
||||||
@Unique
|
|
||||||
public LocalSaveStructure saveStructure;
|
|
||||||
|
|
||||||
@Shadow @Final
|
|
||||||
private DimensionDataStorage overworldDataStorage;
|
|
||||||
@Shadow @Final
|
|
||||||
private LevelStorageSource.LevelStorageAccess levelStorage;
|
|
||||||
@Shadow @Final
|
|
||||||
private WorldGenSettings worldGenSettings;
|
|
||||||
|
|
||||||
@Inject(method = "Lnet/minecraft/util/worldupdate/WorldUpgrader;work()V",
|
|
||||||
at = @At(value = "INVOKE")
|
|
||||||
)
|
|
||||||
private void initWorldUpgrade() {
|
|
||||||
saveStructure = new LocalSaveStructure();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "Lnet/minecraft/util/worldupdate/WorldUpgrader;work()V",
|
|
||||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/util/worldupdate/WorldUpgrader;getAllChunkPos(Lnet/minecraft/resources/ResourceKey;)Ljava/util/List;", shift = At.Shift.AFTER),
|
|
||||||
locals = LocalCapture.CAPTURE_FAILSOFT
|
|
||||||
)
|
|
||||||
private void startWorldUpgrade(CallbackInfo info, ResourceKey resourceKey) {
|
|
||||||
ResourceKey<Level> key = resourceKey;
|
|
||||||
fakeLevelWrapper = new FakeLevelWrapper(levelStorage, worldGenSettings, key);
|
|
||||||
dhServerLevel = new DhServerLevel(saveStructure, fakeLevelWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.forge.mixins.server.unsafe;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
#if MC_VER >= MC_1_18_2
|
|
||||||
|
|
||||||
import net.minecraft.util.ThreadingDetector;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import java.util.concurrent.Semaphore;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Why does this exist? But okay! (Will be probably removed when the experimental generator is done)
|
|
||||||
* FIXME: Recheck this // STILL check this
|
|
||||||
*/
|
|
||||||
@Mixin(ThreadingDetector.class)
|
|
||||||
public class MixinThreadingDetector
|
|
||||||
{
|
|
||||||
@Mutable
|
|
||||||
@Shadow
|
|
||||||
private Semaphore lock;
|
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
private void setSemaphore(CallbackInfo ci)
|
|
||||||
{
|
|
||||||
this.lock = new Semaphore(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
|
||||||
|
|
||||||
@Mixin(ChunkGenerator.class)
|
|
||||||
public class MixinThreadingDetector { }
|
|
||||||
#endif
|
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
"minVersion": "0.8",
|
"minVersion": "0.8",
|
||||||
"package": "com.seibel.distanthorizons.forge.mixins",
|
"package": "com.seibel.distanthorizons.forge.mixins",
|
||||||
"mixins": [
|
"mixins": [
|
||||||
"server.unsafe.MixinThreadingDetector",
|
|
||||||
"server.MixinUtilBackgroundThread",
|
"server.MixinUtilBackgroundThread",
|
||||||
"server.MixinChunkGenerator",
|
"server.MixinChunkGenerator",
|
||||||
"server.MixinTFChunkGenerator"
|
"server.MixinTFChunkGenerator"
|
||||||
@@ -14,7 +13,6 @@
|
|||||||
"client.MixinFogRenderer",
|
"client.MixinFogRenderer",
|
||||||
"client.MixinGameRenderer",
|
"client.MixinGameRenderer",
|
||||||
"client.MixinLevelRenderer",
|
"client.MixinLevelRenderer",
|
||||||
"client.MixinDynamicTexture",
|
|
||||||
"client.MixinLightTexture",
|
"client.MixinLightTexture",
|
||||||
"client.MixinOptionsScreen",
|
"client.MixinOptionsScreen",
|
||||||
"client.MixinTextureUtil"
|
"client.MixinTextureUtil"
|
||||||
|
|||||||
+13
-10
@@ -2,17 +2,15 @@
|
|||||||
org.gradle.jvmargs=-Xmx4096M
|
org.gradle.jvmargs=-Xmx4096M
|
||||||
org.gradle.parallel=true
|
org.gradle.parallel=true
|
||||||
org.gradle.caching=true
|
org.gradle.caching=true
|
||||||
fabric.loom.multiProjectOptimisation=true
|
|
||||||
|
|
||||||
# Mod Info
|
# Mod Info
|
||||||
mod_name=DistantHorizons
|
mod_name=DistantHorizons
|
||||||
mod_id=distanthorizons
|
mod_version=2.1.0-a
|
||||||
mod_version=2.0.2-a-dev
|
api_version=2.0.0
|
||||||
api_version=1.1.0
|
|
||||||
maven_group=com.seibel.distanthorizons
|
maven_group=com.seibel.distanthorizons
|
||||||
mod_readable_name=Distant Horizons
|
mod_readable_name=Distant Horizons
|
||||||
mod_description=This mod generates and renders simplified terrain beyond the normal view distance at a low performance cost. Allowing you to see much farther without turning your game into a slideshow.
|
mod_description=This mod generates and renders simplified terrain beyond the normal view distance at a low performance cost. Allowing you to see much farther without turning your game into a slideshow.
|
||||||
# Note: In forge's mods.toml this is hard coded because Architectury throws an error with setting it as a varuable
|
# Note: In forge's mods.toml this is hard coded because Architectury throws an error with setting it as a variable
|
||||||
mod_authors=["James Seibel", "Leonardo Amato", "Cola", "coolGi", "Ran", "Leetom"]
|
mod_authors=["James Seibel", "Leonardo Amato", "Cola", "coolGi", "Ran", "Leetom"]
|
||||||
mod_homepage=https://modrinth.com/mod/distanthorizons
|
mod_homepage=https://modrinth.com/mod/distanthorizons
|
||||||
mod_source=https://gitlab.com/jeseibel/distant-horizons
|
mod_source=https://gitlab.com/jeseibel/distant-horizons
|
||||||
@@ -20,14 +18,19 @@ mod_issues=https://gitlab.com/jeseibel/distant-horizons/-/issues
|
|||||||
mod_discord=https://discord.gg/xAB8G4cENx
|
mod_discord=https://discord.gg/xAB8G4cENx
|
||||||
|
|
||||||
# Global Plugin Versions
|
# Global Plugin Versions
|
||||||
manifold_version=2024.1.0
|
manifold_version=2023.1.17
|
||||||
|
# 2023.1.17 can be used if there are mystery Java compiler issues
|
||||||
nightconfig_version=3.6.6
|
nightconfig_version=3.6.6
|
||||||
lz4_version=1.8.0
|
lz4_version=1.8.0
|
||||||
|
xz_version=1.9
|
||||||
sqlite_jdbc_version=3.43.0.0
|
sqlite_jdbc_version=3.43.0.0
|
||||||
|
# 8.2.1 is the newest version we can use since that's the version MC 1.16.5 uses
|
||||||
|
# (at least until we can fix the gradle script so core and main can use/shade different fastutil versions)
|
||||||
|
fastutil_version=8.2.1
|
||||||
#svgSalamander_version=1.1.3
|
#svgSalamander_version=1.1.3
|
||||||
|
|
||||||
# Minecraft related libaries (included in MC's jar)
|
# Minecraft related libraries (included in MC's jar)
|
||||||
log4j_version=2.20.0
|
log4j_version=2.23.1
|
||||||
netty_version=4.1.94.Final
|
netty_version=4.1.94.Final
|
||||||
lwjgl_version=3.3.1
|
lwjgl_version=3.3.1
|
||||||
joml_version=1.10.2
|
joml_version=1.10.2
|
||||||
@@ -46,7 +49,7 @@ versionStr=
|
|||||||
|
|
||||||
# This defines what MC version Intellij will use for the preprocessor
|
# This defines what MC version Intellij will use for the preprocessor
|
||||||
# and what version is used automatically by build and run commands
|
# and what version is used automatically by build and run commands
|
||||||
mcVer=1.20.4
|
mcVer=1.20.6
|
||||||
|
|
||||||
# Defines the maximum amount of memory Minecraft is allowed when run in a developement environment
|
# Defines the maximum amount of memory Minecraft is allowed when run in a development environment
|
||||||
#minecraftMemoryJavaArg="-Xmx4G"
|
#minecraftMemoryJavaArg="-Xmx4G"
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
+86
-41
@@ -1,44 +1,98 @@
|
|||||||
unimined.minecraft {
|
plugins {
|
||||||
neoForged {
|
// Note: This is only needed for multi-loader projects
|
||||||
loader neoforge_version
|
// The main architectury loom version is set at the start of the root build.gradle
|
||||||
mixinConfig("DistantHorizons.neoforge.mixins.json")
|
id "architectury-plugin" version "3.4-SNAPSHOT"
|
||||||
|
}
|
||||||
|
|
||||||
file("build/sourcesSets/main/META-INF/").mkdirs()
|
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17
|
||||||
accessTransformer(aw2at(
|
|
||||||
project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener"),
|
architectury {
|
||||||
file("build/sourcesSets/main/META-INF/accesstransformer.cfg") // We'd wanna output the access transformer to somewhere where it'll only appear in the final jar
|
platformSetupLoomIde()
|
||||||
))
|
neoForge()
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO this is already defined in the main settings.gradle file, why doesn't it work unless also defined here? (If compiling does work without this block feel free to remove)
|
||||||
|
repositories {
|
||||||
|
maven {
|
||||||
|
name "Neoforge"
|
||||||
|
url "https://maven.neoforged.net/releases/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//loom {
|
||||||
|
// forge {
|
||||||
|
// convertAccessWideners.set(true)
|
||||||
|
// extraAccessWideners.add("lod.accesswidener")
|
||||||
|
// mixinConfigs("DistantHorizons.mixins.json")
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
loom {
|
||||||
|
silentMojangMappingsLicense() // Shut the licencing warning
|
||||||
|
accessWidenerPath = project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
|
||||||
|
|
||||||
|
neoForge {
|
||||||
|
// Access wideners are now defined in the `remapJar.atAccessWideners`
|
||||||
|
// convertAccessWideners = true
|
||||||
|
// extraAccessWideners.add loom.accessWidenerPath.get().asFile.name
|
||||||
|
|
||||||
|
// Mixins are now defined in the `mods.toml`
|
||||||
|
// mixinConfigs = [
|
||||||
|
// "DistantHorizons.mixins.json"
|
||||||
|
// ]
|
||||||
|
}
|
||||||
|
mixin {
|
||||||
|
// Mixins are now defined in the `mods.toml`
|
||||||
|
// mixinConfigs = [
|
||||||
|
// "DistantHorizons.mixins.json"
|
||||||
|
// ]
|
||||||
|
}
|
||||||
|
|
||||||
|
// "runs" isn't required, but when we do need it then it can be useful
|
||||||
|
runs {
|
||||||
|
client {
|
||||||
|
client()
|
||||||
|
setConfigName("NeoForge Client")
|
||||||
|
ideConfigGenerated(true)
|
||||||
|
runDir("../run")
|
||||||
|
// vmArgs("-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg)
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
server()
|
||||||
|
setConfigName("NeoForge Server")
|
||||||
|
ideConfigGenerated(true)
|
||||||
|
runDir("../run")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
inputFile = shadowJar.archiveFile
|
||||||
|
dependsOn shadowJar
|
||||||
|
// classifier null
|
||||||
|
|
||||||
|
atAccessWideners.add("distanthorizons.accesswidener")
|
||||||
|
}
|
||||||
|
|
||||||
def addMod(path, enabled) {
|
def addMod(path, enabled) {
|
||||||
if (enabled == "2")
|
if (enabled == "2")
|
||||||
dependencies { modImplementation(path) }
|
dependencies { implementation(path) }
|
||||||
else if (enabled == "1")
|
else if (enabled == "1")
|
||||||
dependencies { compileOnly(path) }
|
dependencies { modCompileOnly(path) }
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// Architectury API
|
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
|
||||||
// if (minecraft_version == "1.16.5") {
|
mappings loom.layered() {
|
||||||
// implementation("me.shedaniel:architectury-forge:${rootProject.architectury_version}")
|
// Mojmap mappings
|
||||||
// } else {
|
officialMojangMappings()
|
||||||
// implementation("dev.architectury:architectury-forge:${rootProject.architectury_version}")
|
// Parchment mappings (it adds parameter mappings & javadoc)
|
||||||
// }
|
parchment("org.parchmentmc.data:parchment-${rootProject.parchment_version}@zip")
|
||||||
|
}
|
||||||
// Starlight
|
|
||||||
addMod("curse.maven:starlight-forge-526854:${rootProject.starlight_version_forge}", rootProject.enable_starlight_forge)
|
|
||||||
// annotationProcessor "org.spongepowered:mixin:0.8.4:processor"
|
|
||||||
|
|
||||||
addMod("curse.maven:TerraForged-363820:${rootProject.terraforged_version}", rootProject.enable_terraforged)
|
|
||||||
|
|
||||||
|
// Neoforge
|
||||||
|
neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}"
|
||||||
addMod("curse.maven:TerraFirmaCraft-302973:4616004", rootProject.enable_terrafirmacraft)
|
addMod("curse.maven:TerraFirmaCraft-302973:4616004", rootProject.enable_terrafirmacraft)
|
||||||
|
|
||||||
// annotationProcessor "org.spongepowered:mixin:0.8.5:processor"
|
|
||||||
|
|
||||||
// if (System.getProperty("idea.sync.active") != "true") {
|
|
||||||
// annotationProcessor "org.spongepowered:mixin:0.8.4:processor"
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
task deleteResources(type: Delete) {
|
task deleteResources(type: Delete) {
|
||||||
@@ -54,20 +108,11 @@ processResources {
|
|||||||
dependsOn(tasks.named('copyAllResources'))
|
dependsOn(tasks.named('copyAllResources'))
|
||||||
}
|
}
|
||||||
|
|
||||||
afterEvaluate {
|
tasks.named('runClient') {
|
||||||
runClient {
|
dependsOn(tasks.named('copyAllResources'))
|
||||||
dependsOn(tasks.named('copyAllResources'))
|
finalizedBy(deleteResources)
|
||||||
finalizedBy(deleteResources)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
remapJar {
|
|
||||||
inputFile = shadowJar.archiveFile
|
|
||||||
dependsOn shadowJar
|
|
||||||
// classifier null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sourcesJar {
|
sourcesJar {
|
||||||
def commonSources = project(":common").sourcesJar
|
def commonSources = project(":common").sourcesJar
|
||||||
dependsOn commonSources
|
dependsOn commonSources
|
||||||
|
|||||||
+40
-4
@@ -21,6 +21,7 @@ package com.seibel.distanthorizons.neoforge;
|
|||||||
|
|
||||||
import com.seibel.distanthorizons.common.AbstractModInitializer;
|
import com.seibel.distanthorizons.common.AbstractModInitializer;
|
||||||
import com.seibel.distanthorizons.common.util.ProxyUtil;
|
import com.seibel.distanthorizons.common.util.ProxyUtil;
|
||||||
|
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
||||||
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
|
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
||||||
import com.seibel.distanthorizons.core.api.internal.ClientApi;
|
import com.seibel.distanthorizons.core.api.internal.ClientApi;
|
||||||
@@ -34,6 +35,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapp
|
|||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
||||||
import com.seibel.distanthorizons.coreapi.ModInfo;
|
import com.seibel.distanthorizons.coreapi.ModInfo;
|
||||||
//import io.netty.buffer.ByteBuf;
|
//import io.netty.buffer.ByteBuf;
|
||||||
|
import com.seibel.distanthorizons.coreapi.util.math.Mat4f;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
|
|
||||||
import net.minecraft.client.multiplayer.ClientLevel;
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
@@ -54,10 +56,16 @@ import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
|||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.neoforged.neoforge.client.event.InputEvent;
|
import net.neoforged.neoforge.client.event.InputEvent;
|
||||||
import net.neoforged.neoforge.event.TickEvent;
|
|
||||||
import net.neoforged.bus.api.SubscribeEvent;
|
import net.neoforged.bus.api.SubscribeEvent;
|
||||||
import org.lwjgl.opengl.GL32;
|
import org.lwjgl.opengl.GL32;
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_20_6
|
||||||
|
import net.neoforged.neoforge.event.TickEvent;
|
||||||
|
#else
|
||||||
|
import net.neoforged.neoforge.client.event.ClientTickEvent;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This handles all events sent to the client,
|
* This handles all events sent to the client,
|
||||||
* and is the starting point for most of the mod.
|
* and is the starting point for most of the mod.
|
||||||
@@ -72,8 +80,10 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
|
|
||||||
// private static SimpleChannel multiversePluginChannel;
|
// private static SimpleChannel multiversePluginChannel;
|
||||||
|
|
||||||
|
// Not the cleanest way of passing this to the LOD renderer, but it'll have to do for now
|
||||||
|
public static Mat4f currentModelViewMatrix = new Mat4f();
|
||||||
|
public static Mat4f currentProjectionMatrix = new Mat4f();
|
||||||
|
|
||||||
private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -90,6 +100,7 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
// tick events //
|
// tick events //
|
||||||
//=============//
|
//=============//
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_20_6
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void clientTickEvent(TickEvent.ClientTickEvent event)
|
public void clientTickEvent(TickEvent.ClientTickEvent event)
|
||||||
{
|
{
|
||||||
@@ -98,6 +109,13 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
ClientApi.INSTANCE.clientTickEvent();
|
ClientApi.INSTANCE.clientTickEvent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
@SubscribeEvent
|
||||||
|
public void clientTickEvent(ClientTickEvent.Pre event)
|
||||||
|
{
|
||||||
|
ClientApi.INSTANCE.clientTickEvent();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -151,7 +169,7 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
|
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
|
||||||
|
|
||||||
LevelAccessor level = event.getLevel();
|
LevelAccessor level = event.getLevel();
|
||||||
|
|
||||||
@@ -166,7 +184,7 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.trace("break or block attack at blockPos: " + event.getPos());
|
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
|
||||||
|
|
||||||
LevelAccessor level = event.getLevel();
|
LevelAccessor level = event.getLevel();
|
||||||
|
|
||||||
@@ -281,6 +299,16 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
// rendering //
|
// rendering //
|
||||||
//===========//
|
//===========//
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void beforeLevelRenderEvent(RenderLevelStageEvent event)
|
||||||
|
{
|
||||||
|
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_SKY)
|
||||||
|
{
|
||||||
|
currentModelViewMatrix = McObjectConverter.Convert(event.getModelViewMatrix());
|
||||||
|
currentProjectionMatrix = McObjectConverter.Convert(event.getProjectionMatrix());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void afterLevelRenderEvent(RenderLevelStageEvent event)
|
public void afterLevelRenderEvent(RenderLevelStageEvent event)
|
||||||
{
|
{
|
||||||
@@ -301,4 +329,12 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//================//
|
||||||
|
// helper methods //
|
||||||
|
//================//
|
||||||
|
|
||||||
|
private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,13 +35,18 @@ import net.neoforged.fml.ModLoadingContext;
|
|||||||
import net.neoforged.fml.common.Mod;
|
import net.neoforged.fml.common.Mod;
|
||||||
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
|
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
|
||||||
import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent;
|
import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent;
|
||||||
import net.neoforged.neoforge.client.ConfigScreenHandler;
|
|
||||||
import net.neoforged.neoforge.common.NeoForge;
|
import net.neoforged.neoforge.common.NeoForge;
|
||||||
import net.neoforged.neoforge.event.RegisterCommandsEvent;
|
import net.neoforged.neoforge.event.RegisterCommandsEvent;
|
||||||
import net.neoforged.neoforge.event.server.ServerStartingEvent;
|
import net.neoforged.neoforge.event.server.ServerStartingEvent;
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_20_6
|
||||||
|
import net.neoforged.neoforge.client.ConfigScreenHandler;
|
||||||
|
#else
|
||||||
|
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize and setup the Mod. <br>
|
* Initialize and setup the Mod. <br>
|
||||||
* If you are looking for the real start of the mod
|
* If you are looking for the real start of the mod
|
||||||
@@ -70,8 +75,14 @@ public class NeoforgeMain extends AbstractModInitializer
|
|||||||
{
|
{
|
||||||
this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new);
|
this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new);
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_20_6
|
||||||
ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class,
|
ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class,
|
||||||
() -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> GetConfigScreen.getScreen(parent)));
|
() -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> GetConfigScreen.getScreen(parent)));
|
||||||
|
#else
|
||||||
|
ModLoadingContext.get().registerExtensionPoint(IConfigScreenFactory.class,
|
||||||
|
// TODO fix potential null pointer
|
||||||
|
() -> (client, parent) -> GetConfigScreen.getScreen(parent));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+15
-3
@@ -12,7 +12,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
|||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
import net.neoforged.neoforge.common.NeoForge;
|
import net.neoforged.neoforge.common.NeoForge;
|
||||||
import net.neoforged.neoforge.event.TickEvent;
|
|
||||||
import net.neoforged.neoforge.event.level.ChunkEvent;
|
import net.neoforged.neoforge.event.level.ChunkEvent;
|
||||||
import net.neoforged.neoforge.event.level.LevelEvent;
|
import net.neoforged.neoforge.event.level.LevelEvent;
|
||||||
import net.neoforged.bus.api.SubscribeEvent;
|
import net.neoforged.bus.api.SubscribeEvent;
|
||||||
@@ -20,11 +19,17 @@ import net.neoforged.bus.api.SubscribeEvent;
|
|||||||
import net.neoforged.neoforge.event.server.ServerAboutToStartEvent;
|
import net.neoforged.neoforge.event.server.ServerAboutToStartEvent;
|
||||||
import net.neoforged.neoforge.event.server.ServerStoppingEvent;
|
import net.neoforged.neoforge.event.server.ServerStoppingEvent;
|
||||||
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_20_6
|
||||||
|
import net.neoforged.neoforge.event.TickEvent;
|
||||||
|
#else
|
||||||
|
import net.neoforged.neoforge.event.tick.ServerTickEvent;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
|
public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
|
||||||
{
|
{
|
||||||
private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); }
|
private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); }
|
||||||
@@ -58,7 +63,7 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
|
|||||||
// events //
|
// events //
|
||||||
//========//
|
//========//
|
||||||
|
|
||||||
// ServerTickEvent (at end)
|
#if MC_VER < MC_1_20_6
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void serverTickEvent(TickEvent.ServerTickEvent event)
|
public void serverTickEvent(TickEvent.ServerTickEvent event)
|
||||||
{
|
{
|
||||||
@@ -67,6 +72,13 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
|
|||||||
this.serverApi.serverTickEvent();
|
this.serverApi.serverTickEvent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
@SubscribeEvent
|
||||||
|
public void serverTickEvent(ServerTickEvent.Post event)
|
||||||
|
{
|
||||||
|
this.serverApi.serverTickEvent();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// ServerWorldLoadEvent
|
// ServerWorldLoadEvent
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
|
|||||||
-75
@@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.neoforge.mixins.client;
|
|
||||||
|
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
|
||||||
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
|
||||||
import com.seibel.distanthorizons.common.util.ILightTextureMarker;
|
|
||||||
|
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(DynamicTexture.class)
|
|
||||||
public abstract class MixinDynamicTexture implements ILightTextureMarker
|
|
||||||
{
|
|
||||||
/** Used to prevent accidentally using other dynamic textures as a lightmap */
|
|
||||||
@Unique
|
|
||||||
private boolean isLightTexture = false;
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
#if MC_VER >= MC_1_20_4
|
|
||||||
(remap = false)
|
|
||||||
#endif
|
|
||||||
@Final
|
|
||||||
private NativeImage pixels;
|
|
||||||
|
|
||||||
@Inject(method = "upload()V", at = @At("HEAD"))
|
|
||||||
public void updateLightTexture(CallbackInfo ci)
|
|
||||||
{
|
|
||||||
// since the light map is always updated on the client render thread we should be able to access the client level at the same time
|
|
||||||
IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
|
|
||||||
if (!this.isLightTexture
|
|
||||||
|| mc == null
|
|
||||||
|| mc.getWrappedClientLevel() == null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//ApiShared.LOGGER.info("Lightmap update");
|
|
||||||
IClientLevelWrapper clientLevel = mc.getWrappedClientLevel();
|
|
||||||
MinecraftRenderWrapper.INSTANCE.updateLightmap(this.pixels, clientLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void markLightTexture() { this.isLightTexture = true; }
|
|
||||||
|
|
||||||
}
|
|
||||||
+21
-45
@@ -19,17 +19,18 @@
|
|||||||
|
|
||||||
package com.seibel.distanthorizons.neoforge.mixins.client;
|
package com.seibel.distanthorizons.neoforge.mixins.client;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
#if MC_VER < MC_1_19_4
|
#if MC_VER < MC_1_19_4
|
||||||
import com.mojang.math.Matrix4f;
|
import com.mojang.math.Matrix4f;
|
||||||
#else
|
#else
|
||||||
|
import com.seibel.distanthorizons.neoforge.NeoforgeClientProxy;
|
||||||
import net.minecraft.client.Camera;
|
import net.minecraft.client.Camera;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.GameRenderer;
|
import net.minecraft.client.renderer.GameRenderer;
|
||||||
import net.minecraft.client.renderer.LightTexture;
|
import net.minecraft.client.renderer.LightTexture;
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
#endif
|
#endif
|
||||||
import com.seibel.distanthorizons.common.rendering.SeamlessOverdraw;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
||||||
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
|
||||||
@@ -68,30 +69,6 @@ public class MixinLevelRenderer
|
|||||||
(remap = false)
|
(remap = false)
|
||||||
#endif
|
#endif
|
||||||
private ClientLevel level;
|
private ClientLevel level;
|
||||||
@Unique
|
|
||||||
private static float previousPartialTicks = 0;
|
|
||||||
|
|
||||||
// TODO: Is there any reason why this is here? Can it be deleted?
|
|
||||||
public MixinLevelRenderer()
|
|
||||||
{
|
|
||||||
throw new NullPointerException("Null cannot be cast to non-null type.");
|
|
||||||
}
|
|
||||||
|
|
||||||
#if MC_VER < MC_1_17_1
|
|
||||||
@Inject(at = @At("RETURN"), method = "renderSky(Lcom/mojang/blaze3d/vertex/PoseStack;F)V")
|
|
||||||
private void renderSky(PoseStack matrixStackIn, float partialTicks, CallbackInfo callback)
|
|
||||||
#else
|
|
||||||
@Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true)
|
|
||||||
public void renderClouds(PoseStack poseStack, Matrix4f projectionMatrix, float partialTicks, double cameraX, double cameraY, double cameraZ, CallbackInfo ci)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
// FIXME this is only called when clouds are enabled and vanilla render distance is far enough
|
|
||||||
// not having the partial ticks doesn't appear to be critical currently, but might cause weird issues down the line
|
|
||||||
|
|
||||||
// get the partial ticks since renderBlockLayer doesn't
|
|
||||||
// have access to them
|
|
||||||
previousPartialTicks = partialTicks;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if MC_VER < MC_1_17_1
|
#if MC_VER < MC_1_17_1
|
||||||
@@ -109,12 +86,17 @@ public class MixinLevelRenderer
|
|||||||
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback)
|
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback)
|
||||||
#else
|
#elif MC_VER < MC_1_20_6
|
||||||
@Inject(at = @At("HEAD"),
|
@Inject(at = @At("HEAD"),
|
||||||
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
|
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
|
||||||
#endif
|
#else
|
||||||
|
@Inject(at = @At("HEAD"),
|
||||||
|
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V",
|
||||||
|
cancellable = true)
|
||||||
|
private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// get MC's model view and projection matrices
|
// get MC's model view and projection matrices
|
||||||
#if MC_VER == MC_1_16_5
|
#if MC_VER == MC_1_16_5
|
||||||
@@ -126,10 +108,15 @@ public class MixinLevelRenderer
|
|||||||
|
|
||||||
Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose());
|
Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose());
|
||||||
|
|
||||||
#else
|
#elif MC_VER <= MC_1_20_4
|
||||||
// get the matrices directly from MC
|
// get the matrices directly from MC
|
||||||
Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
|
Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
|
||||||
Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
|
Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
|
||||||
|
#else
|
||||||
|
// get the matrices from neoForge's render event.
|
||||||
|
// We can't call the renderer there because we don't have access to the level that's being rendered
|
||||||
|
Mat4f mcModelViewMatrix = NeoforgeClientProxy.currentModelViewMatrix;
|
||||||
|
Mat4f mcProjectionMatrix = NeoforgeClientProxy.currentProjectionMatrix;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -137,25 +124,11 @@ public class MixinLevelRenderer
|
|||||||
// only render before solid blocks
|
// only render before solid blocks
|
||||||
if (renderType.equals(RenderType.solid()))
|
if (renderType.equals(RenderType.solid()))
|
||||||
{
|
{
|
||||||
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(level), mcModelViewMatrix, mcProjectionMatrix, Minecraft.getInstance().getFrameTime());
|
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, Minecraft.getInstance().getFrameTime());
|
||||||
|
|
||||||
// experimental proof-of-concept option
|
|
||||||
if (Config.Client.Advanced.Graphics.AdvancedGraphics.seamlessOverdraw.get())
|
|
||||||
{
|
|
||||||
float[] matrixFloatArray = SeamlessOverdraw.overwriteMinecraftNearFarClipPlanes(mcProjectionMatrix, previousPartialTicks);
|
|
||||||
|
|
||||||
#if MC_VER == MC_1_16_5
|
|
||||||
SeamlessOverdraw.applyLegacyProjectionMatrix(matrixFloatArray);
|
|
||||||
#elif MC_VER < MC_1_19_4
|
|
||||||
projectionMatrix.load(FloatBuffer.wrap(matrixFloatArray));
|
|
||||||
#else
|
|
||||||
projectionMatrix.set(matrixFloatArray);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (renderType.equals(RenderType.translucent()))
|
else if (renderType.equals(RenderType.translucent()))
|
||||||
{
|
{
|
||||||
ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(level), mcModelViewMatrix, mcProjectionMatrix, Minecraft.getInstance().getFrameTime());
|
ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, Minecraft.getInstance().getFrameTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.Client.Advanced.Debugging.lodOnlyMode.get())
|
if (Config.Client.Advanced.Debugging.lodOnlyMode.get())
|
||||||
@@ -170,9 +143,12 @@ public class MixinLevelRenderer
|
|||||||
#elif MC_VER < MC_1_20_1
|
#elif MC_VER < MC_1_20_1
|
||||||
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
|
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
|
||||||
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
|
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
|
||||||
#else
|
#elif MC_VER < MC_1_20_6
|
||||||
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
|
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
|
||||||
private void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
|
private void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
|
||||||
|
#else
|
||||||
|
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
|
||||||
|
private void callAfterRunUpdates(CallbackInfo ci)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
ChunkWrapper.syncedUpdateClientLightStatus();
|
ChunkWrapper.syncedUpdateClientLightStatus();
|
||||||
|
|||||||
+19
-8
@@ -20,10 +20,13 @@
|
|||||||
package com.seibel.distanthorizons.neoforge.mixins.client;
|
package com.seibel.distanthorizons.neoforge.mixins.client;
|
||||||
|
|
||||||
|
|
||||||
import com.seibel.distanthorizons.common.util.ILightTextureMarker;
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
|
|
||||||
|
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
|
||||||
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
|
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
|
||||||
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
||||||
import net.minecraft.client.renderer.LightTexture;
|
import net.minecraft.client.renderer.LightTexture;
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -36,13 +39,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
public class MixinLightTexture
|
public class MixinLightTexture
|
||||||
{
|
{
|
||||||
@Shadow
|
@Shadow
|
||||||
#if MC_VER >= MC_1_20_4
|
|
||||||
(remap = false)
|
|
||||||
#endif
|
|
||||||
@Final
|
@Final
|
||||||
private DynamicTexture lightTexture;
|
private NativeImage lightPixels;
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
public void markLightTexture(CallbackInfo ci) { ((ILightTextureMarker) this.lightTexture).markLightTexture(); }
|
@Inject(method = "updateLightTexture(F)V", at = @At("RETURN"))
|
||||||
|
public void updateLightTexture(float partialTicks, CallbackInfo ci)
|
||||||
|
{
|
||||||
|
IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
|
||||||
|
if (mc == null || mc.getWrappedClientLevel() == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IClientLevelWrapper clientLevel = mc.getWrappedClientLevel();
|
||||||
|
MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+39
-36
@@ -1,6 +1,6 @@
|
|||||||
package com.seibel.distanthorizons.neoforge.mixins.client;
|
package com.seibel.distanthorizons.neoforge.mixins.client;
|
||||||
|
|
||||||
import com.seibel.distanthorizons.api.enums.config.EUpdateBranch;
|
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
|
||||||
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
|
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
|
||||||
import com.seibel.distanthorizons.core.config.Config;
|
import com.seibel.distanthorizons.core.config.Config;
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
@@ -24,41 +24,44 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
@Mixin(Minecraft.class)
|
@Mixin(Minecraft.class)
|
||||||
public class MixinMinecraft
|
public class MixinMinecraft
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_20_2
|
// commented out due to a bug with Manifold and having nested preprocessors
|
||||||
#if MC_VER == MC_1_20_1
|
// and since neoforge doesn't work for anything before MC 1.20.6 anyway it doesn't need to be included
|
||||||
@Redirect(
|
|
||||||
method = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V",
|
|
||||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V")
|
|
||||||
)
|
|
||||||
public void onOpenScreen(Minecraft instance, Screen guiScreen)
|
|
||||||
{
|
|
||||||
#else
|
|
||||||
@Redirect(
|
|
||||||
method = "<init>(Lnet/minecraft/client/main/GameConfig;)V",
|
|
||||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V")
|
|
||||||
)
|
|
||||||
public void onOpenScreen(Minecraft instance, Screen guiScreen)
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
if (!Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get()) // Don't do anything if the user doesn't want it
|
|
||||||
{
|
|
||||||
instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SelfUpdater.onStart())
|
//#if MC_VER < MC_1_20_2
|
||||||
{
|
//#if MC_VER == MC_1_20_1
|
||||||
instance.setScreen(new UpdateModScreen(
|
//@Redirect(
|
||||||
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
// method = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V",
|
||||||
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()): GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
// at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V")
|
||||||
));
|
//)
|
||||||
}
|
//public void onOpenScreen(Minecraft instance, Screen guiScreen)
|
||||||
else
|
//{
|
||||||
{
|
//#else
|
||||||
instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened
|
//@Redirect(
|
||||||
}
|
// method = "<init>(Lnet/minecraft/client/main/GameConfig;)V",
|
||||||
}
|
// at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V")
|
||||||
#endif
|
//)
|
||||||
|
//public void onOpenScreen(Minecraft instance, Screen guiScreen)
|
||||||
|
//{
|
||||||
|
//#endif
|
||||||
|
// if (!Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get()) // Don't do anything if the user doesn't want it
|
||||||
|
// {
|
||||||
|
// instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (SelfUpdater.onStart())
|
||||||
|
// {
|
||||||
|
// instance.setScreen(new UpdateModScreen(
|
||||||
|
// new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
||||||
|
// (Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()): GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
||||||
|
// ));
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//#endif
|
||||||
|
|
||||||
#if MC_VER >= MC_1_20_2
|
#if MC_VER >= MC_1_20_2
|
||||||
@Redirect(
|
@Redirect(
|
||||||
@@ -76,7 +79,7 @@ public class MixinMinecraft
|
|||||||
Minecraft.getInstance().setScreen(new UpdateModScreen(
|
Minecraft.getInstance().setScreen(new UpdateModScreen(
|
||||||
// TODO: Change to runnable, instead of tittle screen
|
// TODO: Change to runnable, instead of tittle screen
|
||||||
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons
|
||||||
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()) : GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
(Config.Client.Advanced.AutoUpdater.updateBranch.get() == EDhApiUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()) : GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"))
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
+91
-26
@@ -30,52 +30,117 @@ import net.minecraft.network.chat.Component;
|
|||||||
import net.minecraft.network.chat.TranslatableComponent;
|
import net.minecraft.network.chat.TranslatableComponent;
|
||||||
#endif
|
#endif
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
#if MC_VER == MC_1_20_6
|
||||||
|
import net.minecraft.client.gui.layouts.LinearLayout;
|
||||||
|
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a button to the menu to goto the config
|
* Adds a button to the menu to goto the config
|
||||||
*
|
*
|
||||||
* @author coolGi
|
* @author coolGi
|
||||||
* @version 12-02-2021
|
* @version 2024-5-20
|
||||||
*/
|
*/
|
||||||
@Mixin(OptionsScreen.class)
|
@Mixin(OptionsScreen.class)
|
||||||
public class MixinOptionsScreen extends Screen
|
public class MixinOptionsScreen extends Screen
|
||||||
{
|
{
|
||||||
// Get the texture for the button
|
/** Texture used for the config opening button */
|
||||||
|
@Unique
|
||||||
private static final ResourceLocation ICON_TEXTURE = new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
|
private static final ResourceLocation ICON_TEXTURE = new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
|
||||||
protected MixinOptionsScreen(Component title)
|
|
||||||
{
|
|
||||||
super(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(at = @At("HEAD"), method = "init")
|
|
||||||
|
@Unique
|
||||||
|
private TexturedButtonWidget optionsButton = null;
|
||||||
|
|
||||||
|
#if MC_VER == MC_1_20_6
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
protected HeaderAndFooterLayout layout;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//==============//
|
||||||
|
// constructors //
|
||||||
|
//==============//
|
||||||
|
|
||||||
|
protected MixinOptionsScreen(Component title) { super(title); }
|
||||||
|
|
||||||
|
@Inject(at = @At("RETURN"), method = "init")
|
||||||
private void lodconfig$init(CallbackInfo ci)
|
private void lodconfig$init(CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (Config.Client.optionsButton.get())
|
if (Config.Client.optionsButton.get())
|
||||||
this. #if MC_VER < MC_1_17_1 addButton #else addRenderableWidget #endif
|
{
|
||||||
(new TexturedButtonWidget(
|
#if MC_VER < MC_1_17_1
|
||||||
// Where the button is on the screen
|
this.addButton(this.getOptionsButton());
|
||||||
this.width / 2 - 180, this.height / 6 - 12,
|
#elif MC_VER < MC_1_20_6
|
||||||
// Width and height of the button
|
this.addRenderableWidget(this.getOptionsButton());
|
||||||
20, 20,
|
#else
|
||||||
// Offset
|
|
||||||
0, 0,
|
// add the button so it's rendered
|
||||||
// Some textuary stuff
|
this.addRenderableWidget(this.getOptionsButton());
|
||||||
20, ICON_TEXTURE, 20, 40,
|
|
||||||
// Create the button and tell it where to go
|
// add the button to the correct location in the UI
|
||||||
// For now it goes to the client option by default
|
// TODO is there a better way to do this instead of using access transformers to inject into the exact UI elements?
|
||||||
(buttonWidget) -> Objects.requireNonNull(minecraft).setScreen(GetConfigScreen.getScreen(this)),
|
// TODO is there a way we can put the button on the left side of the FOV bar like before?
|
||||||
// Add a title to the button
|
LinearLayout layout = (LinearLayout) this.layout.headerFrame.children.get(0).child;
|
||||||
#if MC_VER < MC_1_19_2
|
|
||||||
new TranslatableComponent(ModInfo.ID + ".title")));
|
// determine how wide the other option buttons are so we can put our botton to the left of them all
|
||||||
#else
|
AtomicInteger width = new AtomicInteger(0);
|
||||||
Component.translatable(ModInfo.ID + ".title")));
|
layout.visitChildren(x -> { width.addAndGet(x.getWidth()); });
|
||||||
#endif
|
width.addAndGet(-10); // padding between the DH button and the FOV slider
|
||||||
|
|
||||||
|
layout.wrapped.addChild(this.getOptionsButton(), 1, 2, (settings) -> { settings.paddingLeft(width.get() * -1); });
|
||||||
|
layout.arrangeElements();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//================//
|
||||||
|
// helper methods //
|
||||||
|
//================//
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
public TexturedButtonWidget getOptionsButton()
|
||||||
|
{
|
||||||
|
if (this.optionsButton == null)
|
||||||
|
{
|
||||||
|
this.optionsButton
|
||||||
|
= new TexturedButtonWidget(
|
||||||
|
// Where the button is on the screen
|
||||||
|
this.width / 2 - 180, this.height / 6 - 12,
|
||||||
|
// Width and height of the button
|
||||||
|
20, 20,
|
||||||
|
// texture UV Offset
|
||||||
|
0, 0,
|
||||||
|
// Some textuary stuff
|
||||||
|
20, ICON_TEXTURE, 20, 40,
|
||||||
|
// Create the button and tell it where to go
|
||||||
|
// For now it goes to the client option by default
|
||||||
|
(buttonWidget) -> Objects.requireNonNull(this.minecraft).setScreen(GetConfigScreen.getScreen(this)),
|
||||||
|
// Add a title to the button
|
||||||
|
#if MC_VER < MC_1_19_2
|
||||||
|
new TranslatableComponent(ModInfo.ID + ".title"));
|
||||||
|
#else
|
||||||
|
Component.translatable(ModInfo.ID + ".title"));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.optionsButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
-126
@@ -1,126 +0,0 @@
|
|||||||
package com.seibel.distanthorizons.neoforge.mixins.client;
|
|
||||||
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
|
|
||||||
|
|
||||||
#if FALSE
|
|
||||||
@Mixin(WorldUpgrader.class)
|
|
||||||
public class MixinWorldUpgrader {
|
|
||||||
static class FakeLevelWrapper implements IServerLevelWrapper {
|
|
||||||
private Path saveFolder;
|
|
||||||
private LevelStem stem;
|
|
||||||
private DimensionType dimension;
|
|
||||||
private DimensionTypeWrapper dimensionTypeWrapper;
|
|
||||||
|
|
||||||
public FakeLevelWrapper(LevelStorageSource.LevelStorageAccess storage, WorldGenSettings gen, ResourceKey<Level> dim) {
|
|
||||||
saveFolder = storage.getDimensionPath(dim);
|
|
||||||
stem = gen.dimensions().getOrThrow(WorldGenSettings.levelToLevelStem(dim));
|
|
||||||
dimension = stem.typeHolder().value();
|
|
||||||
dimensionTypeWrapper = DimensionTypeWrapper.getDimensionTypeWrapper(dimension);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EDhApiLevelType getLevelType() {
|
|
||||||
return EDhApiLevelType.SERVER_LEVEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IDhApiDimensionTypeWrapper getDimensionType() {
|
|
||||||
return dimensionTypeWrapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getBlockLight(int x, int y, int z) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSkyLight(int x, int y, int z) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasCeiling() {
|
|
||||||
return dimension.hasCeiling();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasSkyLight() {
|
|
||||||
return dimension.hasSkyLight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getHeight() {
|
|
||||||
return dimension.height();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMinHeight() {
|
|
||||||
return dimension.minY();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasChunkLoaded(int chunkX, int chunkZ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBlockStateWrapper getBlockState(DhBlockPos pos) {
|
|
||||||
return BlockStateWrapper.AIR;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBiomeWrapper getBiome(DhBlockPos pos) {
|
|
||||||
throw new UnsupportedOperationException("Not implemented yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getWrappedMcObject() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public IClientLevelWrapper tryGetClientLevelWrapper() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public File getSaveFolder() {
|
|
||||||
return saveFolder.toFile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Unique
|
|
||||||
private DhServerLevel dhServerLevel;
|
|
||||||
@Unique
|
|
||||||
private FakeLevelWrapper fakeLevelWrapper;
|
|
||||||
@Unique
|
|
||||||
public LocalSaveStructure saveStructure;
|
|
||||||
|
|
||||||
@Shadow @Final
|
|
||||||
private DimensionDataStorage overworldDataStorage;
|
|
||||||
@Shadow @Final
|
|
||||||
private LevelStorageSource.LevelStorageAccess levelStorage;
|
|
||||||
@Shadow @Final
|
|
||||||
private WorldGenSettings worldGenSettings;
|
|
||||||
|
|
||||||
@Inject(method = "Lnet/minecraft/util/worldupdate/WorldUpgrader;work()V",
|
|
||||||
at = @At(value = "INVOKE")
|
|
||||||
)
|
|
||||||
private void initWorldUpgrade() {
|
|
||||||
saveStructure = new LocalSaveStructure();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "Lnet/minecraft/util/worldupdate/WorldUpgrader;work()V",
|
|
||||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/util/worldupdate/WorldUpgrader;getAllChunkPos(Lnet/minecraft/resources/ResourceKey;)Ljava/util/List;", shift = At.Shift.AFTER),
|
|
||||||
locals = LocalCapture.CAPTURE_FAILSOFT
|
|
||||||
)
|
|
||||||
private void startWorldUpgrade(CallbackInfo info, ResourceKey resourceKey) {
|
|
||||||
ResourceKey<Level> key = resourceKey;
|
|
||||||
fakeLevelWrapper = new FakeLevelWrapper(levelStorage, worldGenSettings, key);
|
|
||||||
dhServerLevel = new DhServerLevel(saveStructure, fakeLevelWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.neoforge.mixins.server.unsafe;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
#if MC_VER >= MC_1_18_2
|
|
||||||
|
|
||||||
import net.minecraft.util.ThreadingDetector;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import java.util.concurrent.Semaphore;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Why does this exist? But okay! (Will be probably removed when the experimental generator is done)
|
|
||||||
* FIXME: Recheck this // STILL check this
|
|
||||||
*/
|
|
||||||
@Mixin(ThreadingDetector.class)
|
|
||||||
public class MixinThreadingDetector
|
|
||||||
{
|
|
||||||
@Mutable
|
|
||||||
@Shadow
|
|
||||||
private Semaphore lock;
|
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
private void setSemaphore(CallbackInfo ci)
|
|
||||||
{
|
|
||||||
this.lock = new Semaphore(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
|
||||||
|
|
||||||
@Mixin(ChunkGenerator.class)
|
|
||||||
public class MixinThreadingDetector { }
|
|
||||||
#endif
|
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
"minVersion": "0.8",
|
"minVersion": "0.8",
|
||||||
"package": "com.seibel.distanthorizons.neoforge.mixins",
|
"package": "com.seibel.distanthorizons.neoforge.mixins",
|
||||||
"mixins": [
|
"mixins": [
|
||||||
"server.unsafe.MixinThreadingDetector",
|
|
||||||
"server.MixinUtilBackgroundThread",
|
"server.MixinUtilBackgroundThread",
|
||||||
"server.MixinChunkGenerator",
|
"server.MixinChunkGenerator",
|
||||||
"server.MixinTFChunkGenerator"
|
"server.MixinTFChunkGenerator"
|
||||||
@@ -14,7 +13,6 @@
|
|||||||
"client.MixinFogRenderer",
|
"client.MixinFogRenderer",
|
||||||
"client.MixinGameRenderer",
|
"client.MixinGameRenderer",
|
||||||
"client.MixinLevelRenderer",
|
"client.MixinLevelRenderer",
|
||||||
"client.MixinDynamicTexture",
|
|
||||||
"client.MixinLightTexture",
|
"client.MixinLightTexture",
|
||||||
"client.MixinOptionsScreen",
|
"client.MixinOptionsScreen",
|
||||||
"client.MixinTextureUtil"
|
"client.MixinTextureUtil"
|
||||||
|
|||||||
+3
-4
@@ -24,13 +24,12 @@ issueTrackerURL = "${issues}"
|
|||||||
acceptableRemoteVersions = "*"
|
acceptableRemoteVersions = "*"
|
||||||
|
|
||||||
# We may need this to make forge (lexforge) & neoforge work together
|
# We may need this to make forge (lexforge) & neoforge work together
|
||||||
#[[mixins]]
|
[[mixins]]
|
||||||
# config = "DistantHorizons.neoforge.mixins.json"
|
config = "DistantHorizons.neoforge.mixins.json"
|
||||||
|
|
||||||
[[dependencies.distanthorizons]]
|
[[dependencies.distanthorizons]]
|
||||||
modId = "minecraft"
|
modId = "minecraft"
|
||||||
mandatory = true # Forge syntax
|
type = "required"
|
||||||
type = "required" # Neoforge syntax
|
|
||||||
versionRange = "${compatible_forgemc_versions}" # Where we set what version of mc it is avalible for
|
versionRange = "${compatible_forgemc_versions}" # Where we set what version of mc it is avalible for
|
||||||
ordering = "NONE"
|
ordering = "NONE"
|
||||||
side = "BOTH"
|
side = "BOTH"
|
||||||
+5
-12
@@ -10,9 +10,13 @@ pluginManagement {
|
|||||||
url "https://maven.minecraftforge.net/"
|
url "https://maven.minecraftforge.net/"
|
||||||
}
|
}
|
||||||
maven {
|
maven {
|
||||||
name "NeoForge"
|
name "NeoForge Releases"
|
||||||
url "https://maven.neoforged.net/releases/"
|
url "https://maven.neoforged.net/releases/"
|
||||||
}
|
}
|
||||||
|
maven {
|
||||||
|
name "NeoForge Snapshot"
|
||||||
|
url "https://maven.neoforged.net/snapshots/"
|
||||||
|
}
|
||||||
maven {
|
maven {
|
||||||
name "Architectury (Better Forge because regular Forge is annoying)" // TODO: Once we switch to NeoForge, would it's gradle work better? or will it have Forge's problems in it
|
name "Architectury (Better Forge because regular Forge is annoying)" // TODO: Once we switch to NeoForge, would it's gradle work better? or will it have Forge's problems in it
|
||||||
url "https://maven.architectury.dev/"
|
url "https://maven.architectury.dev/"
|
||||||
@@ -29,12 +33,6 @@ pluginManagement {
|
|||||||
name "ParchmentMC"
|
name "ParchmentMC"
|
||||||
url "https://maven.parchmentmc.org"
|
url "https://maven.parchmentmc.org"
|
||||||
}
|
}
|
||||||
maven {
|
|
||||||
url = "https://maven.wagyourtail.xyz/releases"
|
|
||||||
}
|
|
||||||
maven {
|
|
||||||
url = "https://maven.wagyourtail.xyz/snapshots"
|
|
||||||
}
|
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
|
|
||||||
@@ -43,11 +41,6 @@ pluginManagement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins {
|
|
||||||
// handles JVM and toolchain downloading
|
|
||||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Throw an error and a little help message if the user forgot to clone the core sub-project
|
// Throw an error and a little help message if the user forgot to clone the core sub-project
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ fabric_api_version=0.42.0+1.16
|
|||||||
immersive_portals_version=
|
immersive_portals_version=
|
||||||
canvas_version=
|
canvas_version=
|
||||||
|
|
||||||
fabric_incompatibility_list={ }
|
fabric_incompatibility_list={ "iris": "*" }
|
||||||
fabric_recommend_list={ "indium": "*" }
|
fabric_recommend_list={}
|
||||||
|
|
||||||
# Fabric mod run
|
# Fabric mod run
|
||||||
# 0 = Don't enable and don't run
|
# 0 = Don't enable and don't run
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ fabric_api_version=0.46.1+1.17
|
|||||||
immersive_portals_version=
|
immersive_portals_version=
|
||||||
canvas_version=
|
canvas_version=
|
||||||
|
|
||||||
fabric_incompatibility_list={ }
|
fabric_incompatibility_list={ "iris": "*" }
|
||||||
fabric_recommend_list={ "indium": "*" }
|
fabric_recommend_list={}
|
||||||
|
|
||||||
# Fabric mod run
|
# Fabric mod run
|
||||||
# 0 = Don't enable and don't run
|
# 0 = Don't enable and don't run
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ fabric_api_version=0.76.0+1.18.2
|
|||||||
immersive_portals_version=v1.4.11-1.18
|
immersive_portals_version=v1.4.11-1.18
|
||||||
canvas_version=mc118:1.0.2616
|
canvas_version=mc118:1.0.2616
|
||||||
|
|
||||||
fabric_incompatibility_list={ }
|
fabric_incompatibility_list={ "iris": "*" }
|
||||||
fabric_recommend_list={ "indium": "*" }
|
fabric_recommend_list={}
|
||||||
|
|
||||||
# Fabric mod run
|
# Fabric mod run
|
||||||
# 0 = Don't enable and don't run
|
# 0 = Don't enable and don't run
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ fabric_api_version=0.76.1+1.19.2
|
|||||||
immersive_portals_version=
|
immersive_portals_version=
|
||||||
canvas_version=mc119-1.0.2480
|
canvas_version=mc119-1.0.2480
|
||||||
|
|
||||||
fabric_incompatibility_list={ }
|
fabric_incompatibility_list={ "iris": "*" }
|
||||||
fabric_recommend_list={ "indium": "*" }
|
fabric_recommend_list={}
|
||||||
|
|
||||||
# Fabric mod run
|
# Fabric mod run
|
||||||
# 0 = Don't enable and don't run
|
# 0 = Don't enable and don't run
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ fabric_api_version=0.87.1+1.19.4
|
|||||||
immersive_portals_version=
|
immersive_portals_version=
|
||||||
canvas_version=
|
canvas_version=
|
||||||
|
|
||||||
fabric_incompatibility_list={ }
|
fabric_incompatibility_list={ "iris": "*" }
|
||||||
fabric_recommend_list={ "indium": "*" }
|
fabric_recommend_list={}
|
||||||
|
|
||||||
# Fabric mod run
|
# Fabric mod run
|
||||||
# 0 = Don't enable and don't run
|
# 0 = Don't enable and don't run
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ accessWidenerVersion=1_20
|
|||||||
builds_for=fabric,forge
|
builds_for=fabric,forge
|
||||||
|
|
||||||
# Fabric loader
|
# Fabric loader
|
||||||
fabric_loader_version=0.14.24
|
fabric_loader_version=0.15.6
|
||||||
fabric_api_version=0.90.4+1.20.1
|
fabric_api_version=0.90.4+1.20.1
|
||||||
# Fabric mod versions
|
# Fabric mod versions
|
||||||
modmenu_version=7.2.2
|
modmenu_version=7.2.2
|
||||||
@@ -20,8 +20,8 @@ fabric_api_version=0.90.4+1.20.1
|
|||||||
immersive_portals_version=
|
immersive_portals_version=
|
||||||
canvas_version=
|
canvas_version=
|
||||||
|
|
||||||
fabric_incompatibility_list={ }
|
fabric_incompatibility_list={ "iris": "<=1.6.20" }
|
||||||
fabric_recommend_list={ "indium": "*" }
|
fabric_recommend_list={}
|
||||||
|
|
||||||
# Fabric mod run
|
# Fabric mod run
|
||||||
# 0 = Don't enable and don't run
|
# 0 = Don't enable and don't run
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ accessWidenerVersion=1_20_2
|
|||||||
builds_for=fabric,forge
|
builds_for=fabric,forge
|
||||||
|
|
||||||
# Fabric loader
|
# Fabric loader
|
||||||
fabric_loader_version=0.14.24
|
fabric_loader_version=0.15.6
|
||||||
fabric_api_version=0.90.4+1.20.2
|
fabric_api_version=0.90.4+1.20.2
|
||||||
# Fabric mod versions
|
# Fabric mod versions
|
||||||
modmenu_version=8.0.0
|
modmenu_version=8.0.0
|
||||||
@@ -20,8 +20,8 @@ fabric_api_version=0.90.4+1.20.2
|
|||||||
immersive_portals_version=
|
immersive_portals_version=
|
||||||
canvas_version=
|
canvas_version=
|
||||||
|
|
||||||
fabric_incompatibility_list={ }
|
fabric_incompatibility_list={ "iris": "<=1.6.20" }
|
||||||
fabric_recommend_list={ "indium": "*" }
|
fabric_recommend_list={}
|
||||||
|
|
||||||
# Fabric mod run
|
# Fabric mod run
|
||||||
# 0 = Don't enable and don't run
|
# 0 = Don't enable and don't run
|
||||||
|
|||||||
@@ -4,10 +4,11 @@ minecraft_version=1.20.4
|
|||||||
parchment_version=1.20.2:2023.12.10
|
parchment_version=1.20.2:2023.12.10
|
||||||
compatible_minecraft_versions=["1.20.3", "1.20.4"]
|
compatible_minecraft_versions=["1.20.3", "1.20.4"]
|
||||||
accessWidenerVersion=1_20_2
|
accessWidenerVersion=1_20_2
|
||||||
builds_for=fabric,neoforge,forge
|
builds_for=fabric,forge
|
||||||
|
# neoforge can be added once the issue with mixins has been resolved
|
||||||
|
|
||||||
# Fabric loader
|
# Fabric loader
|
||||||
fabric_loader_version=0.15.1
|
fabric_loader_version=0.15.6
|
||||||
fabric_api_version=0.91.2+1.20.4
|
fabric_api_version=0.91.2+1.20.4
|
||||||
# Fabric mod versions
|
# Fabric mod versions
|
||||||
modmenu_version=9.0.0-pre.1
|
modmenu_version=9.0.0-pre.1
|
||||||
@@ -20,8 +21,8 @@ fabric_api_version=0.91.2+1.20.4
|
|||||||
immersive_portals_version=
|
immersive_portals_version=
|
||||||
canvas_version=
|
canvas_version=
|
||||||
|
|
||||||
fabric_incompatibility_list={ }
|
fabric_incompatibility_list={ "iris": "<=1.6.20" }
|
||||||
fabric_recommend_list={ "indium": "*" }
|
fabric_recommend_list={}
|
||||||
|
|
||||||
# Fabric mod run
|
# Fabric mod run
|
||||||
# 0 = Don't enable and don't run
|
# 0 = Don't enable and don't run
|
||||||
@@ -38,7 +39,7 @@ fabric_api_version=0.91.2+1.20.4
|
|||||||
|
|
||||||
# (Neo)Forge loader
|
# (Neo)Forge loader
|
||||||
forge_version=49.0.30
|
forge_version=49.0.30
|
||||||
neoforge_version=118-beta
|
neoforge_version=20.4.233
|
||||||
# (Neo)Forge mod versions
|
# (Neo)Forge mod versions
|
||||||
starlight_version_forge=
|
starlight_version_forge=
|
||||||
terraforged_version=
|
terraforged_version=
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# 1.20.6 version
|
||||||
|
java_version=21
|
||||||
|
minecraft_version=1.20.6
|
||||||
|
parchment_version=1.20.6:2024.05.01
|
||||||
|
compatible_minecraft_versions=["1.20.6"]
|
||||||
|
accessWidenerVersion=1_20_6
|
||||||
|
builds_for=fabric,neoforge
|
||||||
|
# forge is broken due to gradle/build script issues
|
||||||
|
|
||||||
|
# Fabric loader
|
||||||
|
fabric_loader_version=0.15.10
|
||||||
|
fabric_api_version=0.97.8+1.20.6
|
||||||
|
# Fabric mod versions
|
||||||
|
modmenu_version=10.0.0-beta.1
|
||||||
|
starlight_version_fabric=
|
||||||
|
phosphor_version_fabric=
|
||||||
|
lithium_version=
|
||||||
|
sodium_version=mc1.20.6-0.5.8
|
||||||
|
iris_version=1.7.0+1.20.6
|
||||||
|
bclib_version=
|
||||||
|
immersive_portals_version=
|
||||||
|
canvas_version=
|
||||||
|
|
||||||
|
fabric_incompatibility_list={ "iris": "<=1.6.20" }
|
||||||
|
fabric_recommend_list={}
|
||||||
|
|
||||||
|
# Fabric mod run
|
||||||
|
# 0 = Don't enable and don't run
|
||||||
|
# 1 = Can be referenced in code but doesn't run
|
||||||
|
# 2 = Can be referenced in code and runs in client
|
||||||
|
enable_starlight=0
|
||||||
|
enable_phosphor=0
|
||||||
|
enable_sodium=1
|
||||||
|
enable_lithium=0
|
||||||
|
enable_iris=1
|
||||||
|
enable_bclib=0
|
||||||
|
enable_immersive_portals=0
|
||||||
|
enable_canvas=0
|
||||||
|
|
||||||
|
# (Neo)Forge loader
|
||||||
|
forge_version=50.0.19
|
||||||
|
neoforge_version=20.6.70-beta
|
||||||
|
# (Neo)Forge mod versions
|
||||||
|
starlight_version_forge=
|
||||||
|
terraforged_version=
|
||||||
|
|
||||||
|
# (Neo)Forge mod run
|
||||||
|
# 0 = Don't enable and don't run
|
||||||
|
# 1 = Can be referenced in code but doesn't run
|
||||||
|
# 2 = Can be referenced in code and runs in client
|
||||||
|
enable_starlight_forge=0
|
||||||
|
enable_terraforged=0
|
||||||
|
enable_terrafirmacraft=0
|
||||||
Reference in New Issue
Block a user