Compare commits

...

150 Commits

Author SHA1 Message Date
coolGi2007 1e52ee15b5 Merge remote-tracking branch 'origin/quilt_test' into quilt_test
# Conflicts:
#	fabric/build.gradle
2022-04-25 16:38:59 +09:30
coolGi2007 b54d478de1 Just a save commit for quilt 2022-04-25 16:36:00 +09:30
Ran 8008d61636 quilt... 2022-04-23 16:47:42 +06:00
coolGi2007 cf38aef742 Fixed quilt running in gradle and updated quilt version 2022-04-23 20:21:45 +10:00
coolGi2007 8621bf631b fixed a bug with a single comma not deleting 2022-04-23 19:29:40 +10:00
coolGi2007 c31c27167f Fixed the quilt authors and added a way to run the fabric module as quilt 2022-04-23 19:19:53 +10:00
Ran 35d97fa98f Please do it like this I want things to be simple 2022-04-23 11:08:28 +06:00
Ran 8627270e5c Basically the simplest way to add quilt support 2022-04-23 11:08:27 +06:00
coolGi2007 69dd7e932d Started adding support for multiple quilt versions (we need to remove quilted fabric api as it is only for 1.18.2) 2022-04-22 18:54:32 +10:00
coolGi2007 74371bd70d Fixed building on quilt (now just the runClient to be fixed) 2022-04-22 17:42:58 +10:00
coolGi2007 4a38b15ece Testing for adding proper quilt support 2022-04-22 11:12:10 +10:00
Ran 96429eec00 Specify how to generate sources in Readme.md 2022-04-18 16:25:47 +00:00
Ran c49e38a58c Add Parchment mappings (it's parameter mappings & javadoc) 2022-04-18 18:59:00 +06:00
TomTheFurry b2047ce0c0 Ops. 2022-04-18 16:11:45 +08:00
TomTheFurry 5b60d515e9 Improve overlapped quads handling + fix minLevel being used to clamp getMaxVerticalData(), causing invalid sized containers being added to incorrect detail level slot in a region. 2022-04-18 16:01:18 +08:00
Ran cf0205caa4 why does it still say preprocessor_test 2022-04-18 04:55:03 +00:00
coolGi2007 c91ab1deb1 Fixed fabric version on readme and added the links to the nightly builds to the readme 2022-04-18 02:41:36 +00:00
coolGi2007 2b5dd236aa Update readme to fix some multiple branch stuff 2022-04-18 02:32:45 +00:00
TomTheFurry 0658479921 Fix critical mem leak in BlockDetail + Add spaced out worldGenThread + make worldGenUpdate update once per 10 ticks + Semi-impl proper EarthCurveRatio limits + make worldGenThreads terminate faster + impl temp bypass to stop deadlocks on BufferFactory destroy() + fix chat logging messages with Throwable twice 2022-04-17 18:07:50 +08:00
TomTheFurry ff8b07ac12 Add config settings for earthCurve thingy 2022-04-15 19:15:56 +08:00
TomTheFurry fb87ee529a Fix dumb mistake + change a bit of stuff 2022-04-15 18:46:39 +08:00
TomTheFurry 1fabc24e45 Add curve shader + fix/change ibo upload 2022-04-15 18:25:59 +08:00
TomTheFurry 9ab2cfcb6a Fix multiple little bugs 2022-04-15 16:48:49 +08:00
Ran e81e31fc24 Maybe fix essential 2022-04-15 00:08:42 +06:00
cola98765 e69b7dec7d fixed block to avoid settings by using proper Heightmap.Types in chunk.getHeight 2022-04-14 19:05:56 +02:00
TomTheFurry 534e4a4377 Fix GpuUploadMethod that use mapping to use DynamicDraw instead of StaticDraw 2022-04-14 18:17:56 +08:00
TomTheFurry 3193773583 '*Fixed*' the T-junction pixel issue... kinda. 2022-04-14 17:00:21 +08:00
TomTheFurry 4d4906228e Rework cortex's ibo, and the buffer objects. 2022-04-14 15:42:37 +08:00
James Seibel e4a1d7478a Add IBO rendering. Thanks Cortex! 2022-04-13 21:11:17 -05:00
Ran cf8eaa57cf Fix loggers 2022-04-13 22:47:12 +06:00
Ran 2211add5e0 Err it should now work? 2022-04-13 19:21:11 +06:00
TomTheFurry e432358e1b Make far fog start at vanilla render distance + make fog multiply caps with inverse near fog if near fog is disabled 2022-04-13 15:00:29 +08:00
TomTheFurry 3ccce80e1d Fix Sodium non-fabulious causing lightmap flicker + add more log for load/unload world + no longer unloading world 3 times on exit due to sub-dim stuff 2022-04-13 14:14:03 +08:00
TomTheFurry 1952f91540 More logging & fix 1.16 getminbuildheight & improve blockdetailmap caching for waterlogged blocks 2022-04-13 13:38:37 +08:00
TomTheFurry 0e1017111e Update core 2022-04-13 12:37:06 +08:00
TomTheFurry b4be8ab83f Update core 2022-04-13 12:11:03 +08:00
James Seibel 3b807dae95 update the version number in ModInfo 2022-04-11 07:16:01 -05:00
TomTheFurry 9fdaeed69b Redo the preprocessor Define system to support 'PRE' & 'POST' 2022-04-09 18:37:38 +08:00
TomTheFurry b7d627f0f5 Fix TF mixin causing crash for forge 2022-04-09 15:53:06 +08:00
TomTheFurry 733bbc0b58 Add back 1.16.5 TerraForged basic support 2022-04-09 15:47:47 +08:00
TomTheFurry 17f6147e13 Fix lightmap, again. 2022-04-09 15:21:59 +08:00
TomTheFurry 08c4c8667a Fix 1.16 config button 2022-04-09 14:04:33 +08:00
TomTheFurry 526791aae7 Fix 1.16 forge 2022-04-09 13:58:02 +08:00
James Seibel 8fdd6dcccc Remove all the fabric.mixin.networking mixins part 2 2022-04-08 22:56:57 -05:00
James Seibel fb4f5819fd Remove all the fabric.mixin.networking mixins 2022-04-08 22:45:43 -05:00
James Seibel 58554f3891 Remove a mixin related to networking 2022-04-08 21:42:04 -05:00
James Seibel 5020084663 Remove the fabric networking code
The code isn't currently in use and is causing issues in 1.16.5.

I put the code in zip files in case someone wants to quickly re-add it.
2022-04-08 21:07:12 -05:00
James Seibel 5aaab01ac9 Fix a few 1.16.5 compiler errors 2022-04-08 20:48:46 -05:00
Ran 024f60de9b that should be all? 2022-04-08 18:30:57 +00:00
Ran 1ccc46869d it's called vertexCount in 1.16 2022-04-08 18:09:42 +00:00
Ran 3edcb8d03d In here we don't need compatibilityLevel 2022-04-08 17:51:27 +00:00
Ran d7189f0f05 Who needs compatibilityLevel 2022-04-08 17:50:31 +00:00
James Seibel f19aa7831e Fix my incorrect revert from yesterday 2022-04-08 12:25:55 +00:00
James Seibel 601eeb7fbe Pipeline changes didn't appear to help any, reverting 2022-04-08 02:43:58 +00:00
James Seibel a8f20a407b Go back to serial building and try a different image 2022-04-08 02:24:26 +00:00
James Seibel 872a7d9fa8 Update .gitlab-ci.yml file 2022-04-08 02:18:14 +00:00
James Seibel 310b85ad83 Try parallel building again, because I can 2022-04-08 02:17:29 +00:00
James Seibel b8d94ba7eb Upload archives even if one build failed and don't stop if one job failed 2022-04-07 03:58:14 +00:00
James Seibel 4c112aa8ae Fix a typo in the license header 2022-04-06 22:28:37 -05:00
James Seibel df6da4b48a Update the license years 2022-04-06 22:24:36 -05:00
James Seibel c3e8449979 Add the copyright header to files missing it 2022-04-06 22:21:46 -05:00
James Seibel d8707bfe01 replace unnecessary error logs with info logs 2022-04-06 21:09:01 -05:00
James Seibel f07940c11f re-add the dev build warning
I should've done this a long time ago and just forgot.
2022-04-06 21:05:05 -05:00
coolGi2007 889c3d32c9 Updated readme and 1.16 can you please build? 2022-04-06 12:59:09 +00:00
coolGi2007 1e502c5933 If I change 1.16 to java 16 would it build? 2022-04-06 22:12:39 +09:30
TomTheFurry f01e31f475 Actually finish porting the world gen for 1.16 + add missing mixin for 1.16 & 1.17 + Solved the deadlock in world gen if moving too fast 2022-04-06 00:10:01 +08:00
TomTheFurry 4285f32b94 Fix chunkLoader bug (H8 tag caps now...) 2022-04-05 23:40:52 +08:00
TomTheFurry af5bcafa45 Make 1.16 build. Confirm 1.18.X working, but others have bugs 2022-04-05 18:18:24 +08:00
coolGi2007 909870b321 Fix some stuff 2022-04-05 18:33:52 +09:30
coolGi2007 2b5dd8b77e Mabye it would work now? 2022-04-05 08:12:36 +00:00
coolGi2007 4d4e4a9706 Changed the java version of DHJarMerger 2022-04-05 07:56:43 +00:00
coolGi2007 ac82e90dc2 Will changing the java version fix CI? 2022-04-05 07:44:18 +00:00
coolGi2007 8063141406 What is the purpose of this?, it works without it 2022-04-05 17:01:29 +09:30
coolGi2007 5c17e9599b Fixed building and started some more work on 1.16.5 2022-04-05 16:11:46 +09:30
coolGi2007 2e54f2166d Might have fixed gradle (ill check it tommorow if it didnt) 2022-04-04 10:36:57 +00:00
coolGi2007 a0bd2ba4a1 Changed something so it might build 2022-04-04 09:57:43 +00:00
TomTheFurry 38102ac17f Fixed up some stuff (Got busy so finish it later) 2022-04-04 17:48:37 +08:00
TomTheFurry 139c5869c9 err... gitlab ci? 3 2022-04-04 17:21:02 +08:00
coolGi2007 79206420f9 INTELLIJ WHY DONT YOU UPDATE THE CORE WHEN PUSHING :( 2022-04-04 18:50:27 +09:30
coolGi2007 e046b972ca Fixed stuff and made core use mc 1.16 version of log4j 2022-04-04 18:49:46 +09:30
coolGi2007 ea4949b3a2 Added 1.16 support and added some other stuff 2022-04-04 18:19:31 +09:30
TomTheFurry 05d5f0b943 err... gitlab ci? 2 2022-04-04 16:45:18 +08:00
TomTheFurry 81df84dc37 err... gitlab ci? 2022-04-04 16:42:22 +08:00
TomTheFurry ff9bab99c7 Fix it so forge in 1.17 works 2022-04-04 16:25:06 +08:00
TomTheFurry 301ea26a03 Fix the onChunkLoad event not firing on 1.17.1 2022-04-04 15:35:20 +08:00
TomTheFurry bd7a03b0ca Fix up the 1.17/1.18 ChunkLoader to be inline with each other. 2022-04-04 15:28:22 +08:00
TomTheFurry 4e0619a269 Merge fix 2022-04-04 14:35:50 +08:00
TomTheFurry 8b13afeb23 It compiles in 1.18.1 & 1.17.1 now! 2022-04-04 14:30:44 +08:00
coolGi2007 ce44feeb40 Forgot to rename the CD zip name 2022-04-03 10:28:09 +00:00
coolGi2007 821e86b875 Updated the CD (now should work) 2022-04-03 19:48:44 +09:30
coolGi2007 015e596eda Fixed building 2022-04-03 19:47:29 +09:30
coolGi2007 09e535abf4 Fixed accesswidener stuff so it can be built 2022-04-03 16:19:54 +09:30
coolGi2007 855f7f0f9a Made lots of things use java 8 and added access wideners for different versions 2022-04-02 19:29:01 +10:30
coolGi2007 5fa3e3cb7f Made new branch with 1.18 and 1.17 combined (still work in progress) 2022-04-01 17:26:43 +10:30
James Seibel 0bddc2dcac Fix invalid files that use the server port 2022-03-30 21:18:59 -05:00
James Seibel 42a8e0e0f0 Add additional logging to getFileBasePath 2022-03-30 19:57:59 -05:00
TomTheFurry 7b77e07a7d Fix race & stuck playerData in sub-dim, add dataPoint verify 2022-03-30 18:39:10 +08:00
cola98765 db17d27823 change XZ setting 3 -> 1 made it easier to change it with static at the start of the file 2022-03-30 11:55:02 +02:00
James Seibel 362b800f25 Close #140 (no rendering if world named "No World Loaded" ) 2022-03-29 20:49:11 -05:00
TomTheFurry 29e26d659d I think test renderer is now more correct? 2022-03-29 13:09:29 +08:00
TomTheFurry afa658cc00 Add RendererType & Debug Renderer + fix Logger bug 2022-03-28 17:04:06 +08:00
James Seibel cde0d466dd Fix a null pointer error when moving empty folders 2022-03-27 21:49:26 -05:00
James Seibel 4031b55630 Fix old folders not moving if sub-dims are disabled 2022-03-27 00:09:41 -05:00
James Seibel 86e07156d1 Make multi-Dim similarity = 0 disable the new system
By default the old system of 1 world per dimension is used
2022-03-26 23:16:12 -05:00
James Seibel 1e8df274ee Update a log in Sub-Dim 2022-03-26 21:34:47 -05:00
James Seibel f0153cc4a6 Fix incorrect files/folders crashing the sub-dim system 2022-03-26 21:27:28 -05:00
James Seibel 3044c238fd Automatically move old files to the new sub-dim system 2022-03-26 20:53:53 -05:00
James Seibel ead58390cd Merge in SubDim changes 2022-03-26 11:39:31 -05:00
TomTheFurry 504d22ff37 Update core 2022-03-26 23:32:50 +08:00
TomTheFurry cc42f8667f Update core 2022-03-26 18:56:39 +08:00
James Seibel 6135b3ce7f Merge branch '1.18.X' of gitlab.com:jeseibel/minecraft-lod-mod into 1.18.X 2022-03-23 21:18:06 -05:00
James Seibel 3c8efa17d5 Add better logging and hopefully fix some issues with multi-dim support 2022-03-23 21:18:03 -05:00
James Seibel dccae0aea0 Re-add the gradle cache to hopefully improve compile speed 2022-03-23 02:06:42 +00:00
James Seibel 2728236ced Merge branch '1.18.X' of gitlab.com:jeseibel/minecraft-lod-mod into 1.18.X 2022-03-22 20:48:46 -05:00
James Seibel 76ce1d6b21 Change the deleteMerged task's folder path 2022-03-22 20:48:37 -05:00
James Seibel 94ddebaec0 Fix some YAML errors 2022-03-23 01:28:43 +00:00
James Seibel cec165176b Go back to sequential compiles, deleting the merged between compiles 2022-03-22 20:13:38 -05:00
James Seibel 99ad837441 comment out one of the artifacts and rename the caches 2022-03-22 19:52:50 -05:00
James Seibel f8be132ba2 Increase compiler memory and flip the compile order 2022-03-22 19:43:49 -05:00
James Seibel 122f5431a6 Try disabling caching and re-enabling the daemon 2022-03-23 00:31:17 +00:00
James Seibel c2884954a4 Disable the gradle daemon to hopefully fix a compiler crash 2022-03-22 12:28:25 +00:00
James Seibel 3a0453c8c5 Dummy commit to trigger a rebuild 2022-03-22 12:22:19 +00:00
TomTheFurry 9d241ab175 Add CaveCullingHeight + 'Fun' mode into config 2022-03-22 18:23:53 +08:00
TomTheFurry ee7eed8d3c Fix 0 size quad bug + improve black face filling 2022-03-22 13:05:22 +08:00
Ran 1125452a8f Fix DHJarMerger 2022-03-22 10:55:30 +06:00
James Seibel a3712c8f72 Last attempt at fixing artifacts incorrectly merging for the night
7707f55b appears to have worked correctly, now if I can just figure out if it was a fluke...
2022-03-22 04:16:35 +00:00
James Seibel e2022fab2d Make compiling sequential to fix a mystery compiler error 2022-03-22 03:36:39 +00:00
James Seibel bcea1be19b Fix the cache key being incorrectly set 2022-03-22 03:20:19 +00:00
James Seibel 8d799203c5 Update .gitlab-ci.yml file 2022-03-22 03:14:55 +00:00
James Seibel 980ce2f2af Go back to parallel builds
And potentially fix the caching
2022-03-22 03:14:25 +00:00
James Seibel c6bea3faa3 Try sequential builds in CI 2022-03-22 03:02:44 +00:00
James Seibel 7707f55b25 Update .gitlab-ci.yml file 2022-03-22 02:39:42 +00:00
James Seibel f087bb7182 Update .gitlab-ci.yml file 2022-03-22 02:38:33 +00:00
James Seibel bf269c9abf Fix an incorrect Array Index 2022-03-21 21:21:22 -05:00
tom lee a8c7405f9d Update core + forgot to undo the always getMaxRenderedChunk() 2022-03-21 17:29:33 +08:00
tom lee 43c9232e7e Update core 2022-03-21 16:56:40 +08:00
tom lee 8351c58d7b Update core + remove Manifold from core + remove awt.Colors 2022-03-21 15:16:37 +08:00
tom lee aa86381b80 Update core 2022-03-20 23:18:23 +08:00
tom lee 563840ca58 Fix some block failing to get correct colors 2022-03-20 17:15:12 +08:00
tom lee b5b9b688c3 Update core 2022-03-20 16:31:04 +08:00
tom lee 3731223087 Update core 2022-03-20 16:27:40 +08:00
tom lee 72d770c0f3 Maybe this will work? 2022-03-20 13:51:49 +08:00
tom lee ee4b83fa99 Fix StructFeatManager to work on 1.18.2 + Update core 2022-03-20 13:42:12 +08:00
James Seibel ee6e3a9876 Merge branch 'preprocessor_test' into 1.18.X 2022-03-19 20:15:18 -05:00
coolGi2007 f84570a6fc Downgraded stuff from 1.18.2 to 1.18.X 2022-03-10 16:35:20 +10:30
James Seibel a0f5af46a2 Closes #217 (Change Server Folder Name)
Adds multiple options for formatting the server folder name.
If LODs have already been generated with a previous setting the files will have to be transferred to the new folder.
2022-03-07 22:16:00 -06:00
James Seibel 18074f15f5 Rename MinecraftWrapper -> MinecraftClientWrapper
closes #150
2022-03-05 18:28:36 -06:00
James Seibel bba0424c6d remove WorldWrapper.isEmpty()
It wasn't used and there was a comment saying not to use it
2022-03-05 18:14:22 -06:00
James Seibel 282f6cfbb8 Update the DependencyHandler to support circular references
Also rename "DependencySetup" To "FabricDependencySetup"
2022-03-05 17:52:22 -06:00
coolGi2007 b97b1b61b7 Reverted the commit that added 1.18.2 to this branch 2022-03-02 18:08:11 +10:30
145 changed files with 4764 additions and 1281 deletions
+3
View File
@@ -51,3 +51,6 @@ Merged/
# file from notepad++ # file from notepad++
*.bak *.bak
# file genearated via MC version switching using preprocessor
build.properties
+93 -55
View File
@@ -3,13 +3,12 @@ image: gradle:eclipse-temurin
# all stages need to be defined here # all stages need to be defined here
stages: stages:
- build_18-1 - build_18_2
- build_18-2 - build_18_1
# - zip_artifacts - build_17_1
- build_16_5
variables: variables:
# If we have correctness issues when compiling this can be set to false
GRADLE_OPTS: "-Dorg.gradle.daemon=true"
# Pull core when building # Pull core when building
GIT_SUBMODULE_STRATEGY: recursive GIT_SUBMODULE_STRATEGY: recursive
@@ -20,59 +19,97 @@ before_script:
- echo GE_JOB_ID=$CI_JOB_ID >> generate_jars.env - echo GE_JOB_ID=$CI_JOB_ID >> generate_jars.env
# 1.18.1 build
build_18-1:
stage: build_18-1
script: ./gradlew build -PmcVer=1.18.1 --gradle-user-home cache/; ./gradlew merge --gradle-user-home cache/
# build using Java 17
image: eclipse-temurin:17
cache:
key: "$CI_COMMIT_REF_NAME_18-1"
policy: pull-push
paths:
- .gradle
- cache/
# 1.16.5 build
build_16_5:
stage: build_16_5
script:
- ./gradlew deleteMerged --gradle-user-home cache/;
- ./gradlew build -PmcVer=1.16.5 --gradle-user-home cache/;
- ./gradlew merge --gradle-user-home cache/;
image: eclipse-temurin:16
artifacts:
name: "Merged_NightlyBuild_1_16_5-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
paths:
- Merged
expire_in: 1 day
when: always
cache:
key: "gradleCache"
policy: pull-push
paths:
- .gradle
- cache/
allow_failure: true
# 1.17.1 build
build_17_1:
stage: build_17_1
script:
- ./gradlew deleteMerged --gradle-user-home cache/;
- ./gradlew build -PmcVer=1.17.1 --gradle-user-home cache/;
- ./gradlew merge --gradle-user-home cache/;
image: eclipse-temurin:16
artifacts:
name: "Merged_NightlyBuild_1_17_1-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
paths:
- Merged
expire_in: 1 day
# even if one build fails, upload the successful jars
when: always
cache:
key: "gradleCache"
policy: pull-push
paths:
- .gradle
- cache/
allow_failure: true
# 1.18.1 build
build_18_1:
stage: build_18_1
script:
- ./gradlew deleteMerged --gradle-user-home cache/; # make sure any previously merged jars are removed before running this job
- ./gradlew build -PmcVer=1.18.1 --gradle-user-home cache/;
- ./gradlew merge --gradle-user-home cache/;
# build using Java 17
image: eclipse-temurin:17
artifacts:
name: "Merged_NightlyBuild_1_18_1-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
paths:
# relative to the root directory
- Merged
expire_in: 1 day
when: always
cache:
key: "gradleCache"
policy: pull-push
paths:
- .gradle
- cache/
allow_failure: true
# 1.18.2 build # 1.18.2 build
build_18-2: build_18_2:
stage: build_18-2 stage: build_18_2
script: ./gradlew build -PmcVer=1.18.2 --gradle-user-home cache/; ./gradlew merge --gradle-user-home cache/ script:
# build using Java 17 - ./gradlew deleteMerged --gradle-user-home cache/;
image: eclipse-temurin:17 - ./gradlew build -PmcVer=1.18.2 --gradle-user-home cache/;
cache: - ./gradlew merge --gradle-user-home cache/;
key: "$CI_COMMIT_REF_NAME_18-2" image: eclipse-temurin:17
policy: pull-push artifacts:
paths: name: "Merged_NightlyBuild_1_18_2-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
- .gradle paths:
- cache/ - Merged
expire_in: 1 day
# TEMPORARY, there should be a way of either generating artifacts per build or in a separate stage when: always
artifacts: cache:
# This should only be done after the last build, otherwise there will be duplicate jars key: "gradleCache"
name: "Merged_NightlyBuild-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}" policy: pull-push
paths: paths:
# relative to the root directory - .gradle
- Merged - cache/
expire_in: 1 day allow_failure: true
# # put artifacts in a zip
# # This should only be done after all the builds have been completed
# zip_artifacts:
# stage: zip_artifacts
# # The complier complains if we don't do something with the script line
# script: echo 'Building complete. Creating artifact Zip.'
# # build using Java 17
# image: eclipse-temurin:17
# artifacts:
# # This should only be done after the last build, otherwise there will be duplicate jars
# name: "Merged_NightlyBuild-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
# paths:
# # relative to the root directory
# - Merged
# expire_in: 1 day
# unused deployment stage # unused deployment stage
@@ -98,3 +135,4 @@ build_18-2:
# url: 'https://gitlab.com/jeseibel/minecraft-lod-mod/cw/-/jobs/${GE_JOB_ID}/artifacts/file/fabric/build/libs' # url: 'https://gitlab.com/jeseibel/minecraft-lod-mod/cw/-/jobs/${GE_JOB_ID}/artifacts/file/fabric/build/libs'
# - name: 'Forge Jars' # - name: 'Forge Jars'
# url: 'https://gitlab.com/jeseibel/minecraft-lod-mod/cw/-/jobs/${GE_JOB_ID}/artifacts/file/forge/build/libs' # url: 'https://gitlab.com/jeseibel/minecraft-lod-mod/cw/-/jobs/${GE_JOB_ID}/artifacts/file/forge/build/libs'
+46
View File
@@ -0,0 +1,46 @@
# 1.16.5 version
java_version=8
minecraft_version=1.16.5
parchment_version=2022.03.06
compatible_minecraft_versions=["1.16.4", "1.16.5"]
# Fabric loader
fabric_loader_version=0.13.2
fabric_api_version=0.42.0+1.16
# Fabric mod versions
modmenu_version=1.16.22
starlight_version_fabric=
phosphor_version_fabric=
lithium_version=mc1.16.5-0.6.6
sodium_version=3488820
iris_version=1.16.x-v1.1.4
bclib_version=
immersive_portals_version =
# Fabric mod run
# 0 = Dont enable and dont run
# 1 = Can be refranced in code but dosnt run
# 2 = Can be refranced in code and runs in client
enable_starlight=0
enable_phosphor=0
enable_lithium=0
enable_sodium=1
enable_iris=0
enable_bclib=0
# Forge loader
forge_version=36.2.28
# Forge mod versions
starlight_version_forge=
terraforged_version=3285909
# Forge mod run
# 0 = Dont enable and dont run
# 1 = Can be refranced in code but dosnt run
# 2 = Can be refranced in code and runs in client
enable_starlight_forge=0
enable_terraforged=2
# Quilt loader
quilt_loader_version=0.16.0-beta.10
+46
View File
@@ -0,0 +1,46 @@
# 1.17.1 version
java_version=16
minecraft_version=1.17.1
parchment_version=2021.12.12
compatible_minecraft_versions=["1.17", "1.17.1"]
# Fabric loader
fabric_loader_version=0.13.2
fabric_api_version=0.46.1+1.17
# Fabric mod versions
modmenu_version=2.0.14
starlight_version_fabric=3442770
phosphor_version_fabric=
lithium_version=mc1.17.1-0.7.5
sodium_version=3605275
iris_version=1.17.x-v1.1.4
bclib_version=
immersive_portals_version = 0.14-1.17
# Fabric mod run
# 0 = Dont enable and dont run
# 1 = Can be refranced in code but dosnt run
# 2 = Can be refranced in code and runs in client
enable_starlight=0
enable_phosphor=0
enable_lithium=0
enable_sodium=1
enable_iris=0
enable_bclib=0
# Forge loader
forge_version=37.1.1
# Forge mod versions
starlight_version_forge=3457784
terraforged_version=
# Forge mod run
# 0 = Dont enable and dont run
# 1 = Can be refranced in code but dosnt run
# 2 = Can be refranced in code and runs in client
enable_starlight_forge=0
enable_terraforged=0
# Quilt loader
quilt_loader_version=0.16.0-beta.10
+11 -2
View File
@@ -1,7 +1,9 @@
# 1.18.1 version based stuff # 1.18.1 version
java_version=17
minecraft_version=1.18.1 minecraft_version=1.18.1
java_version = 17 parchment_version=2022.03.06
compatible_minecraft_versions=["1.18", "1.18.1"]
# Fabric loader # Fabric loader
fabric_loader_version=0.13.3 fabric_loader_version=0.13.3
@@ -9,6 +11,7 @@ fabric_api_version=0.46.6+1.18
# Fabric mod versions # Fabric mod versions
modmenu_version=3.0.1 modmenu_version=3.0.1
starlight_version_fabric=3554912 starlight_version_fabric=3554912
phosphor_version_fabric=3573395
lithium_version=mc1.18.1-0.7.7 lithium_version=mc1.18.1-0.7.7
sodium_version=3605309 sodium_version=3605309
iris_version=1.18.x-v1.1.4 iris_version=1.18.x-v1.1.4
@@ -20,6 +23,7 @@ fabric_api_version=0.46.6+1.18
# 1 = Can be referenced in code but doesn't run # 1 = Can be referenced in code but doesn't run
# 2 = Can be referenced in code and runs in client # 2 = Can be referenced in code and runs in client
enable_starlight=0 enable_starlight=0
enable_phosphor=0
enable_sodium=1 enable_sodium=1
enable_lithium=0 enable_lithium=0
enable_iris=0 enable_iris=0
@@ -29,9 +33,14 @@ fabric_api_version=0.46.6+1.18
forge_version=39.1.2 forge_version=39.1.2
# Forge mod versions # Forge mod versions
starlight_version_forge=3559934 starlight_version_forge=3559934
terraforged_version=
# Forge mod run # Forge mod run
# 0 = Dont enable and don't run # 0 = Dont enable and don't run
# 1 = Can be referenced in code but doesn't run # 1 = Can be referenced in code but doesn't run
# 2 = Can be referenced in code and runs in client # 2 = Can be referenced in code and runs in client
enable_starlight_forge=0 enable_starlight_forge=0
enable_terraforged=0
# Quilt loader
quilt_loader_version=0.16.0-beta.10
+12 -4
View File
@@ -1,8 +1,9 @@
# 1.18.2 version based stuff # 1.18.2 version based stuff
# architectury_plugin_version = 3.4-SNAPSHOT
# dev_architectury_loom_version = 0.10.0-SNAPSHOT java_version=17
minecraft_version=1.18.2 minecraft_version=1.18.2
java_version = 17 parchment_version=2022.03.13
compatible_minecraft_versions=["1.18.2"]
# Fabric loader # Fabric loader
fabric_loader_version=0.13.3 fabric_loader_version=0.13.3
@@ -10,6 +11,7 @@ fabric_api_version=0.48.0+1.18.2
# Fabric mod versions # Fabric mod versions
modmenu_version=3.1.0 modmenu_version=3.1.0
starlight_version_fabric=3667443 starlight_version_fabric=3667443
phosphor_version_fabric=3573395
lithium_version=mc1.18.2-0.7.9 lithium_version=mc1.18.2-0.7.9
sodium_version=3669187 sodium_version=3669187
iris_version=1.18.x-v1.2.2 iris_version=1.18.x-v1.2.2
@@ -21,6 +23,7 @@ fabric_api_version=0.48.0+1.18.2
# 1 = Can be referenced in code but doesn't run # 1 = Can be referenced in code but doesn't run
# 2 = Can be referenced in code and runs in client # 2 = Can be referenced in code and runs in client
enable_starlight=0 enable_starlight=0
enable_phosphor=0
enable_sodium=1 enable_sodium=1
enable_lithium=0 enable_lithium=0
enable_iris=0 enable_iris=0
@@ -30,9 +33,14 @@ fabric_api_version=0.48.0+1.18.2
forge_version=40.0.18 forge_version=40.0.18
# Forge mod versions # Forge mod versions
starlight_version_forge=0 starlight_version_forge=0
terraforged_version=
# Forge mod run # Forge mod run
# 0 = Dont enable and don't run # 0 = Don't enable and don't run
# 1 = Can be referenced in code but doesn't run # 1 = Can be referenced in code but doesn't run
# 2 = Can be referenced in code and runs in client # 2 = Can be referenced in code and runs in client
enable_starlight_forge=0 enable_starlight_forge=0
enable_terraforged=0
# Quilt loader
quilt_loader_version=0.16.0-beta.10
+43 -8
View File
@@ -14,8 +14,17 @@ If you want to see a quick demo, check out a video covering the mod here:
<a href="https://www.youtube.com/watch?v=H2tnvEVbO1c" target="_blank">![Minecraft Level Of Detail (LOD) mod - Alpha 1.5](https://i.ytimg.com/vi_webp/H2tnvEVbO1c/mqdefault.webp)</a> <a href="https://www.youtube.com/watch?v=H2tnvEVbO1c" target="_blank">![Minecraft Level Of Detail (LOD) mod - Alpha 1.5](https://i.ytimg.com/vi_webp/H2tnvEVbO1c/mqdefault.webp)</a>
## About this branch
This is a test branch to add support for the quilt mod loader (https://quiltmc.org/)
### Versions ### Versions
This branch is for these versions of Minecraft
- 1.18.2
- 1.18.1 & 1.18
- 1.17.1 & 1.17
- 1.16.5 & 1.16.4
Architectury version: 3.4-SNAPSHOT\ Architectury version: 3.4-SNAPSHOT\
Java Compiler plugin: Manifold Preprocessor Java Compiler plugin: Manifold Preprocessor
@@ -28,17 +37,36 @@ Modmenu version: 3.1.0
#### 1.18.1 mods #### 1.18.1 mods
Forge version: 39.1.2\ Forge version: 39.1.2\
Fabric version: 0.13.3\ Fabric version: 0.13.3\
Fabric API version: 0.46.6+1.18\ Fabric API version: 0.42.6+1.18\
Modmenu version: 3.0.1 Modmenu version: 3.0.1
#### 1.17.1 mods
Forge version: 37.1.1\
Fabric version: 0.13.2\
Fabric API version: 0.46.1+1.17\
Modmenu version: 2.0.14
#### 1.16.5 mods
Forge version: 36.2.28\
Fabric vetsion: 0.13.2\
Fabric API version: 0.42.0+1.16\
Modmenu version: 1.16.22
Notes:\ Notes:\
This version has been confirmed to work in IDE and Retail Minecraft.\ This version has been confirmed to work in IDE and Retail Minecraft with ether the Fabric or Forge mod-loader.
(Retail running forge version 1.18.1-39.0.5 and fabric version 1.18-0.12.12 and 1.18.1-0.13.2)
## Source Code Installation ## Source Code Installation
#### Nightlly builds
This mod has an autobuild system to automatically build the mod on each commit
- 1.18.2: https://gitlab.com/jeseibel/minecraft-lod-mod/-/jobs/artifacts/main/download?job=build_18_2
- 1.18.1: https://gitlab.com/jeseibel/minecraft-lod-mod/-/jobs/artifacts/main/download?job=build_18_1
- 1.17.1: https://gitlab.com/jeseibel/minecraft-lod-mod/-/jobs/artifacts/main/download?job=build_17_1
- 1.16.5: https://gitlab.com/jeseibel/minecraft-lod-mod/-/jobs/artifacts/main/download?job=build_16_5
See the Fabric Documentation online for more detailed instructions:\ See the Fabric Documentation online for more detailed instructions:\
https://fabricmc.net/wiki/tutorial:setup https://fabricmc.net/wiki/tutorial:setup
@@ -60,11 +88,13 @@ https://fabricmc.net/wiki/tutorial:setup
4. Import the project into eclipse 4. Import the project into eclipse
## Switching Versions ## Switching Versions
This branch support 2 built versions: This branch support 4 built versions:
- 1.18.2 - 1.18.2
- 1.18.1 (which also runs on 1.18) - 1.18.1 (which also runs on 1.18)
- 1.17.1 (which also runs on 1.17)
- 1.16.5 (which also runs 1.16.5)
To switch between active versions, change `mcVer=1.18.?` in `gradle.properties` file. To switch between active versions, change `mcVer=1.?` in `gradle.properties` file.
If running on IDE, to ensure IDE pickup the changed versions, you will need to run a gradle command again to allow gradle to update all the libs. (In IntellJ you will also need to do a gradle sync again if it didn't start it automatically.) If running on IDE, to ensure IDE pickup the changed versions, you will need to run a gradle command again to allow gradle to update all the libs. (In IntellJ you will also need to do a gradle sync again if it didn't start it automatically.)
>Note: There may be a `java.nio.file.FileSystemException` thrown on running the command after switching versions. To fix it, either restart your IDE (as your IDE is locking up a file) or use tools like LockHunter to unlock the linked file. (Often a lib file under `common\build\lib` or `forge\build\lib` or `fabric\build\lib`). If anyone knows how to solve this issue please comment to this issue: https://gitlab.com/jeseibel/minecraft-lod-mod/-/issues/233 >Note: There may be a `java.nio.file.FileSystemException` thrown on running the command after switching versions. To fix it, either restart your IDE (as your IDE is locking up a file) or use tools like LockHunter to unlock the linked file. (Often a lib file under `common\build\lib` or `forge\build\lib` or `fabric\build\lib`). If anyone knows how to solve this issue please comment to this issue: https://gitlab.com/jeseibel/minecraft-lod-mod/-/issues/233
@@ -80,12 +110,12 @@ If running on IDE, to ensure IDE pickup the changed versions, you will need to r
6. The compiled jar file will be in the folder `Merged` 6. The compiled jar file will be in the folder `Merged`
**If in terminal:** **If in terminal:**
1. `git clone -b preprocessor_test --recurse-submodules https://gitlab.com/jeseibel/minecraft-lod-mod.git` 1. `git clone --recurse-submodules https://gitlab.com/jeseibel/minecraft-lod-mod.git`
2. `cd minecraft-lod-mod` 2. `cd minecraft-lod-mod`
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`
>Note: You can add the arg: `-PmcVer=1.18.?` to tell gradle to build a selected MC version instead of having to manually modify the `gradle.properties` file. >Note: You can add the arg: `-PmcVer=1.?` to tell gradle to build a selected MC version instead of having to manually modify the `gradle.properties` file.
## Other commands ## Other commands
@@ -99,7 +129,12 @@ If running on IDE, to ensure IDE pickup the changed versions, you will need to r
The Minecraft source code is NOT added to your workspace in an editable way. Minecraft is treated like a normal Library. Sources are there for documentation and research purposes only. The Minecraft source code is NOT added to your workspace in an editable way. Minecraft is treated like a normal Library. Sources are there for documentation and research purposes only.
Source code uses Mojang mappings. Source code uses Mojang mappings & [Parchment](https://parchmentmc.org/) mappings.
To generate the source code run `./gradlew genSources`\
If your IDE fails to auto-detect the sources JAR when browsing Minecraft classes manually select the JAR file ending with -sources.jar when prompted by your IDE
In IntelliJ it's at the top where it says choose sources when browsing Minecraft classes
## Useful commands ## Useful commands
+192 -33
View File
@@ -9,21 +9,49 @@ buildscript {
plugins { plugins {
id "architectury-plugin" version "3.4-SNAPSHOT" id "architectury-plugin" version "3.4-SNAPSHOT"
id "dev.architectury.loom" version "0.10.0-SNAPSHOT" apply false id "dev.architectury.loom" version "0.11.0-SNAPSHOT" apply false
} }
def writeBuildGradlePredefine() { def writeBuildGradlePredefine(List<String> mcVers, int mcIndex) {
def excapedMCVersion = rootProject.minecraft_version.replace(".", "_") ArrayList<String> redefineList = new ArrayList<String>()
new File(projectDir, "build.properties").text = "MC_VERSION_${excapedMCVersion}=\n" for (int i=0; i<mcVers.size(); i++) {
} String mcStr = mcVers.get(i).replace(".", "_")
if (mcIndex<i) {
def loadProperties() { redefineList.add("PRE_MC_"+mcStr)
def defaultMcVersion = '1.18.2' }
if (!project.hasProperty("mcVer")) { if (mcIndex==i) {
println "No mcVer set! Defaulting to ${defaultMcVersion}." redefineList.add("MC_"+mcStr)
println "Tip: Use -PmcVer='${defaultMcVersion}' in cmd arg to set mcVer." }
if (mcIndex>=i) {
redefineList.add("POST_MC_"+mcStr)
}
}
StringBuilder sb = new StringBuilder()
for (String s : redefineList) {
sb.append(s)
sb.append("=\n")
}
new File(projectDir, "build.properties").text = sb.toString()
}
// Sets up the variables for Manifold in the code
def loadProperties() {
def defaultMcVersion = "1.18.2"
def mcVersion = ""
def mcVers = mcVersions.split(",")
int mcIndex = -1
println "Avalible MC versions: ${mcVersions}"
if (project.hasProperty("mcVer")) {
mcVersion = mcVer
mcIndex = Arrays.asList(mcVers).indexOf(mcVer)
}
if (mcIndex == -1) {
println "No mcVer set or the set mcVer is invalid! Defaulting to ${defaultMcVersion}."
println "Tip: Use -PmcVer='${defaultMcVersion}' in cmd arg to set mcVer."
mcVersion = defaultMcVersion
mcIndex = Arrays.asList(mcVers).indexOf(defaultMcVersion)
assert mcIndex != -1
} }
def mcVersion = project.hasProperty("mcVer") ? mcVer : defaultMcVersion
println "Loading properties file at " + mcVersion + ".properties" println "Loading properties file at " + mcVersion + ".properties"
def props = new Properties() def props = new Properties()
@@ -33,7 +61,17 @@ def loadProperties() {
rootProject.ext.set(prop.key, prop.value) rootProject.ext.set(prop.key, prop.value)
// println "Added prop [key:" + prop.key + ", value:" + prop.value + "]" // println "Added prop [key:" + prop.key + ", value:" + prop.value + "]"
} }
writeBuildGradlePredefine() writeBuildGradlePredefine(Arrays.asList(mcVers), mcIndex)
// Stuff for access wideners
def mcVersionToAcsessWidenerVersion = [
"1.16.5": "1_16",
"1.17.1": "1_17",
"1.18.1": "1_18",
"1.18.2": "1_18",
]
// Use this as sometimes multiple versions use the same access wideners
rootProject.ext.set("acsessWidenerVersion", mcVersionToAcsessWidenerVersion.get(mcVersion))
} }
loadProperties() loadProperties()
@@ -43,11 +81,16 @@ architectury {
minecraft = rootProject.minecraft_version minecraft = rootProject.minecraft_version
} }
subprojects { p -> subprojects { p ->
apply plugin: "dev.architectury.loom" apply plugin: "dev.architectury.loom"
loom { loom {
silentMojangMappingsLicense() silentMojangMappingsLicense()
if (p != project(":core")) {
accessWidenerPath = project(":common").file("src/main/resources/${acsessWidenerVersion}.lod.accesswidener")
}
} }
configurations { configurations {
@@ -58,8 +101,13 @@ subprojects { p ->
dependencies { dependencies {
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
// The following line declares the mojmap mappings // The following line declares the mojmap mappings & parchment mappings
mappings loom.officialMojangMappings() mappings loom.layered() {
// Mojmap mappings
officialMojangMappings()
// Parchment mappings (it adds parameter mappings & javadoc)
parchment("org.parchmentmc.data:parchment-${rootProject.minecraft_version}:${rootProject.parchment_version}@zip")
}
//Manifold //Manifold
annotationProcessor "systems.manifold:manifold-preprocessor:${rootProject.manifold_version}" annotationProcessor "systems.manifold:manifold-preprocessor:${rootProject.manifold_version}"
@@ -67,23 +115,37 @@ subprojects { p ->
// Toml // Toml
implementation("com.electronwill.night-config:toml:${rootProject.toml_version}") implementation("com.electronwill.night-config:toml:${rootProject.toml_version}")
if (p != project(":forge")) { if (p != project(":forge") && p != project(":fabric")) {
// We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies
// Do NOT use other classes from fabric loader unless working with fabric // Do NOT use other classes from fabric loader unless working with fabric
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
} }
if (p == project(":fabric")) {
// We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies
// Do NOT use other classes from fabric loader unless working with fabric
if (rootProject.use_quilt_rather_than_fabric == "true") {
// Quilt loader
modImplementation "org.quiltmc:quilt-loader:${rootProject.quilt_loader_version}"
modImplementation "org.quiltmc:quilt-json5:1.0.0" // Needed for quilt loader but for some reason it dosnt come with it
} else {
// Fabric loader
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
}
}
if (p != project(":core")) { if (p != project(":core")) {
common(project(":core")) { transitive false } common(project(":core")) { transitive false }
shadowMe(project(":core")) { transitive false } shadowMe(project(":core")) { transitive false }
} }
} }
// Allows the jar to run standalone
jar { jar {
manifest { manifest {
attributes 'Implementation-Title': rootProject.archives_base_name, attributes 'Implementation-Title': rootProject.archives_base_name,
'Implementation-Version': rootProject.mod_version, 'Implementation-Version': rootProject.mod_version,
'Main-Class': 'com.seibel.lod.core.JarMain' 'Main-Class': 'com.seibel.lod.core.JarMain' // When changing the main of the jar change this line
} }
} }
} }
@@ -97,13 +159,22 @@ allprojects { p ->
version = rootProject.mod_version version = rootProject.mod_version
group = rootProject.maven_group group = rootProject.maven_group
repositories { repositories {
mavenCentral() mavenCentral()
// For parchment mappings
maven { url "https://maven.parchmentmc.org" }
// used to download and compile dependencies from git repos // used to download and compile dependencies from git repos
maven { url 'https://jitpack.io' } maven { url 'https://jitpack.io' }
// For Manifold Preprocessor // For Manifold Preprocessor
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
// Required for ModMenu
maven { url "https://maven.terraformersmc.com/" }
// Required for importing Modrinth mods // Required for importing Modrinth mods
maven { maven {
@@ -122,6 +193,12 @@ allprojects { p ->
} }
} }
// Required for Quilt
maven {
name 'Quilt'
url 'https://maven.quiltmc.org/repository/release'
}
// These 2 are for importing mods that arnt on CursedForge, Modrinth, GitHub, GitLab or anywhere opensource // These 2 are for importing mods that arnt on CursedForge, Modrinth, GitHub, GitLab or anywhere opensource
flatDir { flatDir {
dirs "${rootDir}/mods/fabric" dirs "${rootDir}/mods/fabric"
@@ -135,24 +212,55 @@ allprojects { p ->
includeGroup "forge-mod" includeGroup "forge-mod"
} }
} }
flatDir {
dirs "${rootDir}/mods/quilt"
content {
includeGroup "quilt-mod"
}
}
} }
// Make a new author thing for quilt as quilt uses a different layout for their authors
// The output to look something like this {"James":"Developer","coolGi":"Developer}
def currentAuthor = ""
def quiltAuthors = "{"
def authorCounter = false;
for (reader in rootProject.mod_authors) {
if (authorCounter)
currentAuthor = currentAuthor + reader
if (reader == "\"") {
authorCounter = !authorCounter
if (!authorCounter) {
currentAuthor = currentAuthor.substring(0, currentAuthor.length() - 1); // Delete the qotation mark at the end of the authors name
quiltAuthors = quiltAuthors + "\"" + currentAuthor + "\":\"Developer\"," // Add the author to the string
currentAuthor = ""
}
}
}
quiltAuthors = quiltAuthors.substring(0, quiltAuthors.length() - 1) // Delete the final comma
quiltAuthors = quiltAuthors + "}"
// Put stuff from gradle.properties into the mod info // Put stuff from gradle.properties into the mod info
processResources { processResources {
def resourceTargets = ["fabric.mod.json", "META-INF/mods.toml"] // Location of where to put def resourceTargets = ["fabric.mod.json", "quilt.mod.json", "META-INF/mods.toml"] // Location of where to put
def intoTargets = ["$buildDir/resources/main/"] // Location of the built resources folder def intoTargets = ["$buildDir/resources/main/"] // Location of the built resources folder
def replaceProperties = [ def replaceProperties = [
version: mod_version, version : mod_version,
mod_name: mod_name, mod_name : mod_name,
authors: mod_authors, authors : mod_authors,
description: mod_description, quilt_authors : quiltAuthors,
homepage: mod_homepage, description : mod_description,
source: mod_source, homepage : mod_homepage,
issues: mod_issues, source : mod_source,
minecraft_version: minecraft_version, issues : mod_issues,
java_version: java_version minecraft_version : minecraft_version,
] // The left side is what gets replaced in the mod info and the right side is where to get it from in the gradle.properties compatible_minecraft_versions: compatible_minecraft_versions,
java_version : java_version
]
// The left side is what gets replaced in the mod info and the right side is where to get it from in the gradle.properties
//TODO: Make Forge loader version also be relaced with non hardcoded value instead of "[36,41)" //TODO: Make Forge loader version also be relaced with non hardcoded value instead of "[36,41)"
inputs.properties replaceProperties inputs.properties replaceProperties
@@ -175,25 +283,76 @@ allprojects { p ->
} }
// Copies the correct accesswidener and renames it
task copyAccessWidener(type: Copy) {
from project(":common").file("src/main/resources/${rootProject.acsessWidenerVersion}.lod.accesswidener")
into(file(p.file("build/resources/main")))
rename "${rootProject.acsessWidenerVersion}.lod.accesswidener", "lod.accesswidener"
}
task copyCoreResources(type: Copy) {
from fileTree(project(":core").file("src/main/resources"))
into p.file("build/resources/main")
}
task copyCommonResources(type: Copy) {
from fileTree(project(":common").file("src/main/resources"))
into p.file("build/resources/main")
}
// Is this necessary for running the fabric build
if (p == project(":common")) {
println "Copying [common/src/main/resources/${acsessWidenerVersion}.lod.accesswidner] to [fabric/build/resources/main]."
copy {
from project(":common").file("src/main/resources/${acsessWidenerVersion}.lod.accesswidener")
into project(":fabric").file("build/resources/main")
rename "${acsessWidenerVersion}.lod.accesswidener", "lod.accesswidener"
}
}
tasks.withType(JavaCompile) { tasks.withType(JavaCompile) {
// Add Manifold Preprocessor // Add Manifold Preprocessor
// def excapedMCVersion = rootProject.minecraft_version.replace(".", "_") // def excapedMCVersion = rootProject.minecraft_version.replace(".", "_")
// options.compilerArgs += ['-Xplugin:Manifold', "-AMC_VERSION_${excapedMCVersion}"] // options.compilerArgs += ['-Xplugin:Manifold', "-AMC_VERSION_${excapedMCVersion}"]
// //
options.compilerArgs += ['-Xplugin:Manifold'] //options.compilerArgs += ['-deprecation']
//options.compilerArgs += ['-verbose']
//options.compilerArgs += ['-Xlint:unchecked']
//options.compilerArgs += ['-Xdiags:verbose']
//options.compilerArgs += ['-Xprint']
//options.compilerArgs += ['-XprintProcessorInfo']
//options.compilerArgs += ['-XprintRounds']
// println options.compilerArgs // println options.compilerArgs
options.encoding = "UTF-8"
// Set the java version
if (p != project(":core")) { if (p != project(":core")) {
options.compilerArgs += ['-Xplugin:Manifold']
options.release = rootProject.java_version as Integer options.release = rootProject.java_version as Integer
} else if (p == project(":core")) {
options.release = 8; // Core should use Java 8 no matter what
} }
// TODO: make everything use java 8
// options.release = 8 // Use Java 8 for everything so back porting is easier
} }
java { java {
withSourcesJar() withSourcesJar()
} }
// Disable running the core and common
if (p == project(":core") || p == project(":common")) { if (p == project(":core") || p == project(":common")) {
runClient.enabled = false runClient.enabled = false
runServer.enabled = false runServer.enabled = false
} }
} }
// this deletes the merged folder so we don't carry over
// the previous merges to each new build job in the CI/CD pipeline
task deleteMerged(type: Delete) {
delete files("./Merged")
}
-1
View File
@@ -1 +0,0 @@
MC_VERSION_1_18_2=
+1 -13
View File
@@ -1,17 +1,5 @@
loom {
accessWidenerPath.set(file("src/main/resources/lod.accesswidener"))
}
architectury { architectury {
common() common(rootProject.enabled_platforms.split(","))
}
afterEvaluate {
tasks {
remapJar {
remapAccessWidener.set(false)
}
}
} }
publishing { publishing {
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -29,6 +29,8 @@ import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.I
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.IClient.IGraphics.IFogQuality.IAdvancedFog.IHeightFog; import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.IClient.IGraphics.IFogQuality.IAdvancedFog.IHeightFog;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.IClient.IMultiplayer; import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.IClient.IMultiplayer;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.IClient.IWorldGenerator; import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.IClient.IWorldGenerator;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.IClient.IAdvanced;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton.IClient.IAdvanced.IDebugging.*;
/** /**
@@ -258,6 +260,11 @@ public class Config
@ConfigAnnotations.Entry @ConfigAnnotations.Entry
public static VanillaOverdraw vanillaOverdraw = IAdvancedGraphics.VANILLA_OVERDRAW_DEFAULT; public static VanillaOverdraw vanillaOverdraw = IAdvancedGraphics.VANILLA_OVERDRAW_DEFAULT;
@ConfigAnnotations.FileComment
public static String _overdrawOffset = IAdvancedGraphics.OVERDRAW_OFFSET_DESC;
@ConfigAnnotations.Entry(minValue = -16, maxValue = 16)
public static int overdrawOffset = IAdvancedGraphics.OVERDRAW_OFFSET_MIN_DEFAULT_MAX.defaultValue;
@ConfigAnnotations.FileComment @ConfigAnnotations.FileComment
public static String _useExtendedNearClipPlane = IAdvancedGraphics.USE_EXTENDED_NEAR_CLIP_PLANE_DESC; public static String _useExtendedNearClipPlane = IAdvancedGraphics.USE_EXTENDED_NEAR_CLIP_PLANE_DESC;
@ConfigAnnotations.Entry @ConfigAnnotations.Entry
@@ -273,6 +280,21 @@ public class Config
@ConfigAnnotations.Entry @ConfigAnnotations.Entry
public static double saturationMultiplier = IAdvancedGraphics.SATURATION_MULTIPLIER_DEFAULT; public static double saturationMultiplier = IAdvancedGraphics.SATURATION_MULTIPLIER_DEFAULT;
@ConfigAnnotations.FileComment
public static String _enableCaveCulling = IAdvancedGraphics.ENABLE_CAVE_CULLING_DESC;
@ConfigAnnotations.Entry
public static boolean enableCaveCulling = IAdvancedGraphics.ENABLE_CAVE_CULLING_DEFAULT;
@ConfigAnnotations.FileComment
public static String _caveCullingHeight = IAdvancedGraphics.CAVE_CULLING_HEIGHT_DESC;
@ConfigAnnotations.Entry(minValue = -4096, maxValue = 4096)
public static int caveCullingHeight = IAdvancedGraphics.CAVE_CULLING_HEIGHT_MIN_DEFAULT_MAX.defaultValue;
@ConfigAnnotations.FileComment
public static String _earthCurveRatio = IAdvancedGraphics.EARTH_CURVE_RATIO_DESC;
@ConfigAnnotations.Entry(minValue = 0, maxValue = 5000)
public static int earthCurveRatio = IAdvancedGraphics.EARTH_CURVE_RATIO_MIN_DEFAULT_MAX.defaultValue;
/* /*
@ConfigAnnotations.FileComment @ConfigAnnotations.FileComment
public static String _backsideCullingRange = IAdvancedGraphics.VANILLA_CULLING_RANGE_DESC; public static String _backsideCullingRange = IAdvancedGraphics.VANILLA_CULLING_RANGE_DESC;
@@ -329,8 +351,8 @@ public class Config
@ConfigAnnotations.FileComment @ConfigAnnotations.FileComment
public static String _multiDimensionRequiredSimilarity = IMultiplayer.MULTI_DIMENSION_REQUIRED_SIMILARITY_DESC; public static String _multiDimensionRequiredSimilarity = IMultiplayer.MULTI_DIMENSION_REQUIRED_SIMILARITY_DESC;
@ConfigAnnotations.Entry @ConfigAnnotations.Entry(minValue = 0.0, maxValue = 1.0)
public static double multiDimensionRequiredSimilarity = IMultiplayer.MULTI_DIMENSION_REQUIRED_SIMILARITY_DEFAULT; public static double multiDimensionRequiredSimilarity = IMultiplayer.MULTI_DIMENSION_REQUIRED_SIMILARITY_MIN_DEFAULT_MAX.defaultValue;
} }
@@ -346,13 +368,18 @@ public class Config
@ConfigAnnotations.ScreenEntry @ConfigAnnotations.ScreenEntry
public static Buffers buffers; public static Buffers buffers;
@ConfigAnnotations.FileComment
public static String _lodOnlyMode = IAdvanced.LOD_ONLY_MODE_DESC;
@ConfigAnnotations.Entry
public static boolean lodOnlyMode = IAdvanced.LOD_ONLY_MODE_DEFAULT;
public static class Threading public static class Threading
{ {
@ConfigAnnotations.FileComment @ConfigAnnotations.FileComment
public static String _numberOfWorldGenerationThreads = IThreading.NUMBER_OF_WORLD_GENERATION_THREADS_DESC; public static String _numberOfWorldGenerationThreads = IThreading.NUMBER_OF_WORLD_GENERATION_THREADS_DESC;
@ConfigAnnotations.Entry(minValue = 1, maxValue = 50) @ConfigAnnotations.Entry(minValue = 0.1, maxValue = 50.0)
public static int numberOfWorldGenerationThreads = IThreading.NUMBER_OF_WORLD_GENERATION_THREADS_DEFAULT.defaultValue; public static double numberOfWorldGenerationThreads = IThreading.NUMBER_OF_WORLD_GENERATION_THREADS_DEFAULT.defaultValue;
@ConfigAnnotations.FileComment @ConfigAnnotations.FileComment
public static String _numberOfBufferBuilderThreads = IThreading.NUMBER_OF_BUFFER_BUILDER_THREADS_DESC; public static String _numberOfBufferBuilderThreads = IThreading.NUMBER_OF_BUFFER_BUILDER_THREADS_DESC;
@@ -364,9 +391,9 @@ public class Config
public static class Debugging public static class Debugging
{ {
@ConfigAnnotations.FileComment @ConfigAnnotations.FileComment
public static String _drawLods = IDebugging.DRAW_LODS_DESC; public static String _rendererType = IDebugging.RENDERER_TYPE_DESC;
@ConfigAnnotations.Entry @ConfigAnnotations.Entry
public static boolean drawLods = IDebugging.DRAW_LODS_DEFAULT; public static RendererType rendererType = IDebugging.RENDERER_TYPE_DEFAULT;
@ConfigAnnotations.FileComment @ConfigAnnotations.FileComment
public static String _debugMode = IDebugging.DEBUG_MODE_DESC; public static String _debugMode = IDebugging.DEBUG_MODE_DESC;
@@ -377,6 +404,67 @@ public class Config
public static String _enableDebugKeybindings = IDebugging.DEBUG_KEYBINDINGS_ENABLED_DESC; public static String _enableDebugKeybindings = IDebugging.DEBUG_KEYBINDINGS_ENABLED_DESC;
@ConfigAnnotations.Entry @ConfigAnnotations.Entry
public static boolean enableDebugKeybindings = IDebugging.DEBUG_KEYBINDINGS_ENABLED_DEFAULT; public static boolean enableDebugKeybindings = IDebugging.DEBUG_KEYBINDINGS_ENABLED_DEFAULT;
@ConfigAnnotations.ScreenEntry
public static DebugSwitch debugSwitch;
public static class DebugSwitch {
/* The logging switches available:
* WorldGenEvent
* WorldGenPerformance
* WorldGenLoadEvent
* LodBuilderEvent
* RendererBufferEvent
* RendererGLEvent
* FileReadWriteEvent
* FileSubDimEvent
* NetworkEvent //NOT IMPL YET
*/
@ConfigAnnotations.FileComment
public static String _logWorldGenEvent = IDebugSwitch.LOG_WORLDGEN_EVENT_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logWorldGenEvent = IDebugSwitch.LOG_WORLDGEN_EVENT_DEFAULT;
@ConfigAnnotations.FileComment
public static String _logWorldGenPerformance = IDebugSwitch.LOG_WORLDGEN_PERFORMANCE_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logWorldGenPerformance = IDebugSwitch.LOG_WORLDGEN_PERFORMANCE_DEFAULT;
@ConfigAnnotations.FileComment
public static String _logWorldGenLoadEvent = IDebugSwitch.LOG_WORLDGEN_LOAD_EVENT_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logWorldGenLoadEvent = IDebugSwitch.LOG_WORLDGEN_LOAD_EVENT_DEFAULT;
@ConfigAnnotations.FileComment
public static String _logLodBuilderEvent = IDebugSwitch.LOG_LODBUILDER_EVENT_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logLodBuilderEvent = IDebugSwitch.LOG_LODBUILDER_EVENT_DEFAULT;
@ConfigAnnotations.FileComment
public static String _logRendererBufferEvent = IDebugSwitch.LOG_RENDERER_BUFFER_EVENT_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logRendererBufferEvent = IDebugSwitch.LOG_RENDERER_BUFFER_EVENT_DEFAULT;
@ConfigAnnotations.FileComment
public static String _logRendererGLEvent = IDebugSwitch.LOG_RENDERER_GL_EVENT_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logRendererGLEvent = IDebugSwitch.LOG_RENDERER_GL_EVENT_DEFAULT;
@ConfigAnnotations.FileComment
public static String _logFileReadWriteEvent = IDebugSwitch.LOG_FILE_READWRITE_EVENT_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logFileReadWriteEvent = IDebugSwitch.LOG_FILE_READWRITE_EVENT_DEFAULT;
@ConfigAnnotations.FileComment
public static String _logFileSubDimEvent = IDebugSwitch.LOG_FILE_SUB_DIM_EVENT_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logFileSubDimEvent = IDebugSwitch.LOG_FILE_SUB_DIM_EVENT_DEFAULT;
@ConfigAnnotations.FileComment
public static String _logNetworkEvent = IDebugSwitch.LOG_NETWORK_EVENT_DESC;
@ConfigAnnotations.Entry
public static LoggerMode logNetworkEvent = IDebugSwitch.LOG_NETWORK_EVENT_DEFAULT;
}
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common; package com.seibel.lod.common;
import com.seibel.lod.common.forge.LodForgeMethodCaller; import com.seibel.lod.common.forge.LodForgeMethodCaller;
@@ -1,8 +1,29 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.forge; package com.seibel.lod.common.forge;
import com.seibel.lod.common.wrappers.minecraft.MinecraftClientWrapper; import com.seibel.lod.common.wrappers.minecraft.MinecraftClientWrapper;
import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.level.ColorResolver;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@@ -16,4 +37,6 @@ import java.util.Random;
*/ */
public interface LodForgeMethodCaller { public interface LodForgeMethodCaller {
List<BakedQuad> getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, Random random); List<BakedQuad> getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, Random random);
int colorResolverGetColor(ColorResolver resolver, Biome biome, double x, double z);
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.networking; package com.seibel.lod.common.networking;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.networking; package com.seibel.lod.common.networking;
/** /**
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.networking; package com.seibel.lod.common.networking;
import com.seibel.lod.core.ModInfo; import com.seibel.lod.core.ModInfo;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers; package com.seibel.lod.common.wrappers;
import com.seibel.lod.common.LodCommonMain; import com.seibel.lod.common.LodCommonMain;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers; package com.seibel.lod.common.wrappers;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -1,3 +1,21 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers; package com.seibel.lod.common.wrappers;
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -1,7 +1,27 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.block; package com.seibel.lod.common.wrappers.block;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import com.seibel.lod.core.api.ApiShared;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@@ -14,13 +34,13 @@ public class BlockDetailMap
private BlockDetailMap() {} private BlockDetailMap() {}
public static BlockDetailWrapper getOrMakeBlockDetailCache(BlockState bs, BlockPos pos, LevelReader getter) { public static BlockDetailWrapper getOrMakeBlockDetailCache(BlockState bs, BlockPos pos, LevelReader getter) {
if (!bs.getFluidState().isEmpty()) {
bs = bs.getFluidState().createLegacyBlock();
}
BlockDetailWrapper cache = map.get(bs); BlockDetailWrapper cache = map.get(bs);
if (cache != null) return cache; if (cache != null) return cache;
if (bs.getFluidState().isEmpty()) { cache = BlockDetailWrapper.make(bs, pos, getter);
cache = BlockDetailWrapper.make(bs, pos, getter); //ApiShared.LOGGER.info("New blockDetail cache for {} to {} ", bs, cache);
} else {
cache = BlockDetailWrapper.make(bs.getFluidState().createLegacyBlock(), pos, getter);
}
BlockDetailWrapper cacheCAS = map.putIfAbsent(bs, cache); BlockDetailWrapper cacheCAS = map.putIfAbsent(bs, cache);
return cacheCAS==null ? cache : cacheCAS; return cacheCAS==null ? cache : cacheCAS;
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.block; package com.seibel.lod.common.wrappers.block;
import java.util.Arrays; import java.util.Arrays;
@@ -50,6 +69,8 @@ import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
/*-- WARN: This class should NEVER hold reference to anything large,
as this is never dealloc until the end of runtime!! --*/
public class BlockDetailWrapper extends IBlockDetailWrapper public class BlockDetailWrapper extends IBlockDetailWrapper
{ {
private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class); private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
@@ -139,10 +160,6 @@ public class BlockDetailWrapper extends IBlockDetailWrapper
return tempColor; return tempColor;
} }
private static final Block[] BLOCK_TO_AVOID = {Blocks.AIR, Blocks.CAVE_AIR, Blocks.BARRIER}; private static final Block[] BLOCK_TO_AVOID = {Blocks.AIR, Blocks.CAVE_AIR, Blocks.BARRIER};
private static final Direction[] DIRECTION_ORDER = {Direction.UP, Direction.NORTH, Direction.EAST, Direction.WEST, Direction.SOUTH, Direction.DOWN}; private static final Direction[] DIRECTION_ORDER = {Direction.UP, Direction.NORTH, Direction.EAST, Direction.WEST, Direction.SOUTH, Direction.DOWN};
@@ -154,10 +171,11 @@ public class BlockDetailWrapper extends IBlockDetailWrapper
} }
final BlockState state; final BlockState state;
final BlockPos samplePos;
final LevelReader sampleGetter;
boolean isShapeResolved = false; //boolean isShapeResolved = false;
//^ Shapes no longer lazy resolved due to memory leaks from needing
// to keep a reference to the block getter
boolean[] dontOccludeFaces = null; boolean[] dontOccludeFaces = null;
boolean noCollision = false; boolean noCollision = false;
boolean noFullFace = false; boolean noFullFace = false;
@@ -172,14 +190,12 @@ public class BlockDetailWrapper extends IBlockDetailWrapper
public BlockDetailWrapper(BlockState state, BlockPos pos, LevelReader getter) { public BlockDetailWrapper(BlockState state, BlockPos pos, LevelReader getter) {
this.state = state; this.state = state;
this.samplePos = pos; resolveShapes(getter, pos);
this.sampleGetter = getter; //ApiShared.LOGGER.info("Created BlockDetailWrapper for blockstate {} at {}", state, pos);
} }
private BlockDetailWrapper() { private BlockDetailWrapper() {
this.state = null; this.state = null;
this.samplePos = null;
this.sampleGetter = null;
} }
static BlockDetailWrapper make(BlockState bs, BlockPos pos, LevelReader getter) { static BlockDetailWrapper make(BlockState bs, BlockPos pos, LevelReader getter) {
@@ -194,8 +210,8 @@ public class BlockDetailWrapper extends IBlockDetailWrapper
} }
} }
private void resolveShapes() { private void resolveShapes(LevelReader sampleGetter, BlockPos samplePos) {
if (isShapeResolved) return; //if (isShapeResolved) return;
if (state.getFluidState().isEmpty()) { if (state.getFluidState().isEmpty()) {
noCollision = state.getCollisionShape(sampleGetter, samplePos).isEmpty(); noCollision = state.getCollisionShape(sampleGetter, samplePos).isEmpty();
dontOccludeFaces = new boolean[6]; dontOccludeFaces = new boolean[6];
@@ -222,7 +238,6 @@ public class BlockDetailWrapper extends IBlockDetailWrapper
} else { // Liquid Block } else { // Liquid Block
dontOccludeFaces = new boolean[6]; dontOccludeFaces = new boolean[6];
} }
isShapeResolved = true;
} }
private void resolveColors() { private void resolveColors() {
@@ -237,21 +252,31 @@ public class BlockDetailWrapper extends IBlockDetailWrapper
!(state.getBlock() instanceof RotatedPillarBlock && direction == Direction.UP)) !(state.getBlock() instanceof RotatedPillarBlock && direction == Direction.UP))
break; break;
}; };
if (quads == null || quads.isEmpty()) {
quads = Minecraft.getInstance().getModelManager().getBlockModelShaper().
getBlockModel(state).getQuads(state, null, random);
}
if (quads != null && !quads.isEmpty()) { if (quads != null && !quads.isEmpty()) {
needPostTinting = quads.get(0).isTinted(); needPostTinting = quads.get(0).isTinted();
needShade = quads.get(0).isShade(); needShade = quads.get(0).isShade();
tintIndex = quads.get(0).getTintIndex(); tintIndex = quads.get(0).getTintIndex();
baseColor = calculateColorFromTexture(quads.get(0).getSprite(), baseColor = calculateColorFromTexture(
#if PRE_MC_1_17_1 quads.get(0).sprite,
#else quads.get(0).getSprite(), #endif
ColorMode.getColorMode(state.getBlock())); ColorMode.getColorMode(state.getBlock()));
} } else { // Backup method.
needPostTinting = false;
needShade = false;
tintIndex = 0;
baseColor = calculateColorFromTexture(Minecraft.getInstance().getModelManager().getBlockModelShaper().getParticleIcon(state),
ColorMode.getColorMode(state.getBlock()));
}
} else { // Liquid Block } else { // Liquid Block
needPostTinting = true; needPostTinting = true;
needShade = false; needShade = false;
tintIndex = 0; tintIndex = 0;
baseColor = calculateColorFromTexture(Minecraft.getInstance().getModelManager().getBlockModelShaper().getParticleIcon(state), baseColor = calculateColorFromTexture(Minecraft.getInstance().getModelManager().getBlockModelShaper().getParticleIcon(state),
ColorMode.getColorMode(state.getBlock())); ColorMode.getColorMode(state.getBlock()));
} }
isColorResolved = true; isColorResolved = true;
} }
@@ -281,21 +306,21 @@ public class BlockDetailWrapper extends IBlockDetailWrapper
@Override @Override
public boolean hasFaceCullingFor(LodDirection dir) public boolean hasFaceCullingFor(LodDirection dir)
{ {
resolveShapes(); //resolveShapes();
return !dontOccludeFaces[dir.ordinal()]; return !dontOccludeFaces[dir.ordinal()];
} }
@Override @Override
public boolean hasNoCollision() public boolean hasNoCollision()
{ {
resolveShapes(); //resolveShapes();
return noCollision; return noCollision;
} }
@Override @Override
public boolean noFaceIsFullFace() public boolean noFaceIsFullFace()
{ {
resolveShapes(); //resolveShapes();
return noFullFace; return noFullFace;
} }
@@ -312,4 +337,7 @@ public class BlockDetailWrapper extends IBlockDetailWrapper
return ((BlockDetailWrapper)iBlockDetail).state.getBlock().equals(state.getBlock()); return ((BlockDetailWrapper)iBlockDetail).state.getBlock().equals(state.getBlock());
} }
public String toString() {
return "BlockDetail{" + state + "}";
}
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.block; package com.seibel.lod.common.wrappers.block;
import java.util.Objects; import java.util.Objects;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.block; package com.seibel.lod.common.wrappers.block;
@@ -18,11 +37,16 @@ public class TextureAtlasSpriteWrapper {
* The code has been modified to use TextureAtlasSprite * The code has been modified to use TextureAtlasSprite
*/ */
public static int getPixelRGBA(TextureAtlasSprite sprite, int frameIndex, int x, int y) { public static int getPixelRGBA(TextureAtlasSprite sprite, int frameIndex, int x, int y) {
#if PRE_MC_1_17_1
return sprite.mainImage[0].getPixelRGBA(
x + sprite.framesX[frameIndex] * sprite.getWidth(),
y + sprite.framesY[frameIndex] * sprite.getHeight());
#else
if (sprite.animatedTexture != null) { if (sprite.animatedTexture != null) {
x += sprite.animatedTexture.getFrameX(frameIndex) * sprite.width; x += sprite.animatedTexture.getFrameX(frameIndex) * sprite.width;
y += sprite.animatedTexture.getFrameY(frameIndex) * sprite.height; y += sprite.animatedTexture.getFrameY(frameIndex) * sprite.height;
} }
return sprite.mainImage[0].getPixelRGBA(x, y); return sprite.mainImage[0].getPixelRGBA(x, y);
#endif
} }
} }
@@ -1,5 +1,25 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.block; package com.seibel.lod.common.wrappers.block;
import com.seibel.lod.common.LodCommonMain;
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
import net.minecraft.Util; import net.minecraft.Util;
import net.minecraft.client.color.block.BlockTintCache; import net.minecraft.client.color.block.BlockTintCache;
@@ -27,29 +47,27 @@ import java.util.stream.Stream;
public class TintGetterOverrideFast implements BlockAndTintGetter { public class TintGetterOverrideFast implements BlockAndTintGetter {
LevelReader parent; LevelReader parent;
private final Object2ObjectArrayMap<ColorResolver, ConcurrentHashMap<Biome, Integer>> tintCaches;
public TintGetterOverrideFast(LevelReader parent) { public TintGetterOverrideFast(LevelReader parent) {
this.parent = parent; this.parent = parent;
this.tintCaches = Util.make(new Object2ObjectArrayMap(3), object2ObjectArrayMap -> {
object2ObjectArrayMap.put(BiomeColors.GRASS_COLOR_RESOLVER, new ConcurrentHashMap<Biome, Integer>());
object2ObjectArrayMap.put(BiomeColors.FOLIAGE_COLOR_RESOLVER, new ConcurrentHashMap<Biome, Integer>());
object2ObjectArrayMap.put(BiomeColors.WATER_COLOR_RESOLVER, new ConcurrentHashMap<Biome, Integer>());
});
} }
private Biome _getBiome(BlockPos pos) { private Biome _getBiome(BlockPos pos) {
#if MC_VERSION_1_18_2 #if POST_MC_1_18_2
return parent.getBiome(pos).value(); return parent.getBiome(pos).value();
#elif MC_VERSION_1_18_1 #else
return parent.getBiome(pos); return parent.getBiome(pos);
#endif #endif
} }
@Override @Override
public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) { public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) {
Biome b = _getBiome(blockPos); if (LodCommonMain.forgeMethodCaller != null) {
return tintCaches.get(colorResolver).computeIfAbsent(b, (key) -> colorResolver.getColor(b, blockPos.getX(), blockPos.getZ())); return LodCommonMain.forgeMethodCaller.colorResolverGetColor(colorResolver, _getBiome(blockPos),
blockPos.getX(), blockPos.getZ());
} else {
return colorResolver.getColor(_getBiome(blockPos), blockPos.getX(), blockPos.getZ());
}
} }
@Override @Override
@@ -83,10 +101,6 @@ public class TintGetterOverrideFast implements BlockAndTintGetter {
return parent.getBlockEntity(blockPos); return parent.getBlockEntity(blockPos);
} }
@Override
public <T extends BlockEntity> Optional<T> getBlockEntity(BlockPos blockPos, BlockEntityType<T> blockEntityType) {
return parent.getBlockEntity(blockPos, blockEntityType);
}
@Override @Override
public BlockState getBlockState(BlockPos blockPos) { public BlockState getBlockState(BlockPos blockPos) {
@@ -113,11 +127,6 @@ public class TintGetterOverrideFast implements BlockAndTintGetter {
return parent.getBlockStates(aABB); return parent.getBlockStates(aABB);
} }
@Override
public BlockHitResult isBlockInLine(ClipBlockStateContext clipBlockStateContext) {
return parent.isBlockInLine(clipBlockStateContext);
}
@Override @Override
public BlockHitResult clip(ClipContext clipContext) { public BlockHitResult clip(ClipContext clipContext) {
return parent.clip(clipContext); return parent.clip(clipContext);
@@ -139,6 +148,22 @@ public class TintGetterOverrideFast implements BlockAndTintGetter {
return parent.getBlockFloorHeight(blockPos); return parent.getBlockFloorHeight(blockPos);
} }
@Override
public int getMaxBuildHeight() {
return parent.getMaxBuildHeight();
}
#if POST_MC_1_17_1
@Override
public <T extends BlockEntity> Optional<T> getBlockEntity(BlockPos blockPos, BlockEntityType<T> blockEntityType) {
return parent.getBlockEntity(blockPos, blockEntityType);
}
@Override
public BlockHitResult isBlockInLine(ClipBlockStateContext clipBlockStateContext) {
return parent.isBlockInLine(clipBlockStateContext);
}
@Override @Override
public int getHeight() { public int getHeight() {
return parent.getHeight(); return parent.getHeight();
@@ -149,11 +174,6 @@ public class TintGetterOverrideFast implements BlockAndTintGetter {
return parent.getMinBuildHeight(); return parent.getMinBuildHeight();
} }
@Override
public int getMaxBuildHeight() {
return parent.getMaxBuildHeight();
}
@Override @Override
public int getSectionsCount() { public int getSectionsCount() {
return parent.getSectionsCount(); return parent.getSectionsCount();
@@ -193,4 +213,5 @@ public class TintGetterOverrideFast implements BlockAndTintGetter {
public int getSectionYFromSectionIndex(int i) { public int getSectionYFromSectionIndex(int i) {
return parent.getSectionYFromSectionIndex(i); return parent.getSectionYFromSectionIndex(i);
} }
#endif
} }
@@ -1,5 +1,25 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.block; package com.seibel.lod.common.wrappers.block;
import com.seibel.lod.common.LodCommonMain;
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
import net.minecraft.Util; import net.minecraft.Util;
import net.minecraft.client.color.block.BlockTintCache; import net.minecraft.client.color.block.BlockTintCache;
@@ -26,24 +46,18 @@ import java.util.stream.Stream;
public class TintGetterOverrideSmooth implements BlockAndTintGetter { public class TintGetterOverrideSmooth implements BlockAndTintGetter {
LevelReader parent; LevelReader parent;
private final Object2ObjectArrayMap<ColorResolver, BlockTintCache> tintCaches;
public int smoothingRange; public int smoothingRange;
public TintGetterOverrideSmooth(LevelReader parent, int smoothingRange) { public TintGetterOverrideSmooth(LevelReader parent, int smoothingRange) {
this.parent = parent; this.parent = parent;
this.smoothingRange = smoothingRange; this.smoothingRange = smoothingRange;
this.tintCaches = Util.make(new Object2ObjectArrayMap(3), object2ObjectArrayMap -> {
object2ObjectArrayMap.put(BiomeColors.GRASS_COLOR_RESOLVER, new BlockTintCache((pos) -> calculateBlockTint(pos, BiomeColors.GRASS_COLOR_RESOLVER)));
object2ObjectArrayMap.put(BiomeColors.FOLIAGE_COLOR_RESOLVER, new BlockTintCache((pos) -> calculateBlockTint(pos, BiomeColors.FOLIAGE_COLOR_RESOLVER)));
object2ObjectArrayMap.put(BiomeColors.WATER_COLOR_RESOLVER, new BlockTintCache((pos) -> calculateBlockTint(pos, BiomeColors.WATER_COLOR_RESOLVER)));
});
} }
private Biome _getBiome(BlockPos pos) { private Biome _getBiome(BlockPos pos) {
#if MC_VERSION_1_18_2 #if POST_MC_1_18_2
return parent.getBiome(pos).value(); return parent.getBiome(pos).value();
#elif MC_VERSION_1_18_1 #else
return parent.getBiome(pos); return parent.getBiome(pos);
#endif #endif
} }
@@ -61,7 +75,14 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter {
while (cursor3D.advance()) while (cursor3D.advance())
{ {
mutableBlockPos.set(cursor3D.nextX(), cursor3D.nextY(), cursor3D.nextZ()); mutableBlockPos.set(cursor3D.nextX(), cursor3D.nextY(), cursor3D.nextZ());
int n = colorResolver.getColor(_getBiome(mutableBlockPos), mutableBlockPos.getX(), mutableBlockPos.getZ()); int n;
if (LodCommonMain.forgeMethodCaller != null) {
n = LodCommonMain.forgeMethodCaller.colorResolverGetColor(colorResolver, _getBiome(mutableBlockPos),
mutableBlockPos.getX(), mutableBlockPos.getZ());
} else {
n = colorResolver.getColor(_getBiome(mutableBlockPos), mutableBlockPos.getX(), mutableBlockPos.getZ());
}
k += (n & 0xFF0000) >> 16; k += (n & 0xFF0000) >> 16;
l += (n & 0xFF00) >> 8; l += (n & 0xFF00) >> 8;
m += n & 0xFF; m += n & 0xFF;
@@ -71,8 +92,7 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter {
@Override @Override
public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) { public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) {
BlockTintCache blockTintCache = this.tintCaches.get(colorResolver); return calculateBlockTint(blockPos, colorResolver);
return blockTintCache.getColor(blockPos);
} }
@Override @Override
@@ -106,11 +126,6 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter {
return parent.getBlockEntity(blockPos); return parent.getBlockEntity(blockPos);
} }
@Override
public <T extends BlockEntity> Optional<T> getBlockEntity(BlockPos blockPos, BlockEntityType<T> blockEntityType) {
return parent.getBlockEntity(blockPos, blockEntityType);
}
@Override @Override
public BlockState getBlockState(BlockPos blockPos) { public BlockState getBlockState(BlockPos blockPos) {
return parent.getBlockState(blockPos); return parent.getBlockState(blockPos);
@@ -136,11 +151,6 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter {
return parent.getBlockStates(aABB); return parent.getBlockStates(aABB);
} }
@Override
public BlockHitResult isBlockInLine(ClipBlockStateContext clipBlockStateContext) {
return parent.isBlockInLine(clipBlockStateContext);
}
@Override @Override
public BlockHitResult clip(ClipContext clipContext) { public BlockHitResult clip(ClipContext clipContext) {
return parent.clip(clipContext); return parent.clip(clipContext);
@@ -162,6 +172,22 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter {
return parent.getBlockFloorHeight(blockPos); return parent.getBlockFloorHeight(blockPos);
} }
@Override
public int getMaxBuildHeight() {
return parent.getMaxBuildHeight();
}
#if POST_MC_1_17_1
@Override
public <T extends BlockEntity> Optional<T> getBlockEntity(BlockPos blockPos, BlockEntityType<T> blockEntityType) {
return parent.getBlockEntity(blockPos, blockEntityType);
}
@Override
public BlockHitResult isBlockInLine(ClipBlockStateContext clipBlockStateContext) {
return parent.isBlockInLine(clipBlockStateContext);
}
@Override @Override
public int getHeight() { public int getHeight() {
return parent.getHeight(); return parent.getHeight();
@@ -172,11 +198,6 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter {
return parent.getMinBuildHeight(); return parent.getMinBuildHeight();
} }
@Override
public int getMaxBuildHeight() {
return parent.getMaxBuildHeight();
}
@Override @Override
public int getSectionsCount() { public int getSectionsCount() {
return parent.getSectionsCount(); return parent.getSectionsCount();
@@ -216,4 +237,5 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter {
public int getSectionYFromSectionIndex(int i) { public int getSectionYFromSectionIndex(int i) {
return parent.getSectionYFromSectionIndex(i); return parent.getSectionYFromSectionIndex(i);
} }
#endif
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.chunk; package com.seibel.lod.common.wrappers.chunk;
import java.util.Objects; import java.util.Objects;
@@ -129,7 +148,11 @@ public class ChunkPosWrapper extends AbstractChunkPosWrapper
public AbstractBlockPosWrapper getWorldPosition() public AbstractBlockPosWrapper getWorldPosition()
{ {
// the parameter here is the y position // the parameter here is the y position
#if PRE_MC_1_17_1
BlockPos blockPos = chunkPos.getWorldPosition();
#else
BlockPos blockPos = chunkPos.getMiddleBlockPosition(0); BlockPos blockPos = chunkPos.getMiddleBlockPosition(0);
#endif
return new BlockPosWrapper(blockPos.getX(), blockPos.getY(), blockPos.getZ()); return new BlockPosWrapper(blockPos.getX(), blockPos.getY(), blockPos.getZ());
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.chunk; package com.seibel.lod.common.wrappers.chunk;
import com.seibel.lod.common.wrappers.block.BlockDetailWrapper; import com.seibel.lod.common.wrappers.block.BlockDetailWrapper;
@@ -14,7 +33,9 @@ import com.seibel.lod.common.wrappers.world.BiomeWrapper;
import com.seibel.lod.common.wrappers.worldGeneration.mimicObject.LightedWorldGenRegion; import com.seibel.lod.common.wrappers.worldGeneration.mimicObject.LightedWorldGenRegion;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
#if POST_MC_1_17_1
import net.minecraft.core.QuartPos; import net.minecraft.core.QuartPos;
#endif
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.block.LiquidBlockContainer; import net.minecraft.world.level.block.LiquidBlockContainer;
@@ -45,13 +66,21 @@ public class ChunkWrapper implements IChunkWrapper
@Override @Override
public int getHeight(){ public int getHeight(){
#if PRE_MC_1_17_1
return 255;
#else
return chunk.getHeight(); return chunk.getHeight();
#endif
} }
@Override @Override
public int getMinBuildHeight() public int getMinBuildHeight()
{ {
#if PRE_MC_1_17_1
return 0;
#else
return chunk.getMinBuildHeight(); return chunk.getMinBuildHeight();
#endif
} }
@Override @Override
public int getMaxBuildHeight() public int getMaxBuildHeight()
@@ -68,13 +97,19 @@ public class ChunkWrapper implements IChunkWrapper
@Override @Override
public IBiomeWrapper getBiome(int x, int y, int z) public IBiomeWrapper getBiome(int x, int y, int z)
{ {
#if MC_VERSION_1_18_2 #if PRE_MC_1_17_1
return BiomeWrapper.getBiomeWrapper(chunk.getBiomes().getNoiseBiome(
x >> 2, y >> 2, z >> 2));
#elif PRE_MC_1_18_1
return BiomeWrapper.getBiomeWrapper(chunk.getBiomes().getNoiseBiome(
QuartPos.fromBlock(x), QuartPos.fromBlock(y), QuartPos.fromBlock(z)));
#elif PRE_MC_1_18_2
return BiomeWrapper.getBiomeWrapper(chunk.getNoiseBiome(
QuartPos.fromBlock(x), QuartPos.fromBlock(y), QuartPos.fromBlock(z)));
#else
return BiomeWrapper.getBiomeWrapper(chunk.getNoiseBiome( return BiomeWrapper.getBiomeWrapper(chunk.getNoiseBiome(
QuartPos.fromBlock(x), QuartPos.fromBlock(y), QuartPos.fromBlock(z)).value()); QuartPos.fromBlock(x), QuartPos.fromBlock(y), QuartPos.fromBlock(z)).value());
#elif MC_VERSION_1_18_1 #endif
return BiomeWrapper.getBiomeWrapper(chunk.getNoiseBiome(
QuartPos.fromBlock(x), QuartPos.fromBlock(y), QuartPos.fromBlock(z)));
#endif
} }
@Override @Override
@@ -127,7 +162,7 @@ public class ChunkWrapper implements IChunkWrapper
@Override @Override
public int getMaxY(int x, int z) { public int getMaxY(int x, int z) {
return chunk.getHeight(Heightmap.Types.MOTION_BLOCKING, Math.floorMod(x, 16), Math.floorMod(z, 16)); return chunk.getHeight(Heightmap.Types.WORLD_SURFACE, Math.floorMod(x, 16), Math.floorMod(z, 16));
} }
@Override @Override
@@ -154,11 +189,14 @@ public class ChunkWrapper implements IChunkWrapper
@Override @Override
public boolean isLightCorrect(){ public boolean isLightCorrect(){
//return true; #if PRE_MC_1_18_1
return true;
#else
if (chunk instanceof LevelChunk) { if (chunk instanceof LevelChunk) {
return ((LevelChunk) chunk).isClientLightReady(); return ((LevelChunk) chunk).isClientLightReady();
} }
return chunk.isLightCorrect(); return chunk.isLightCorrect();
#endif
} }
public boolean isWaterLogged(int x, int y, int z) public boolean isWaterLogged(int x, int y, int z)
@@ -205,4 +243,9 @@ public class ChunkWrapper implements IChunkWrapper
return lightSource; return lightSource;
} }
@Override
public String toString() {
return chunk.getClass().getSimpleName() + chunk.getPos();
}
} }
@@ -50,7 +50,9 @@ import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.client.resources.language.I18n; // translation import net.minecraft.client.resources.language.I18n; // translation
import net.minecraft.client.gui.narration.NarratableEntry; // Remove in 1.16 #if POST_MC_1_17_1
import net.minecraft.client.gui.narration.NarratableEntry;
#endif
/** /**
* Based upon TinyConfig * Based upon TinyConfig
@@ -528,6 +530,17 @@ public abstract class ConfigGui
Objects.requireNonNull(minecraft).setScreen(this.parent); Objects.requireNonNull(minecraft).setScreen(this.parent);
} }
// addRenderableWidget in 1.17 and over
// addButton in 1.16 and below
private Button addBtn(Button button) {
#if PRE_MC_1_17_1
this.addButton(button);
#else
this.addRenderableWidget(button);
#endif
return button;
}
@Override @Override
protected void init() protected void init()
{ {
@@ -535,14 +548,11 @@ public abstract class ConfigGui
if (!reload) if (!reload)
loadFromFile(); loadFromFile();
// addRenderableWidget in 1.17 and over addBtn(new Button(this.width / 2 - 154, this.height - 28, 150, 20, CommonComponents.GUI_CANCEL, button -> {
// addButton in 1.16 and below
this.addRenderableWidget(new Button(this.width / 2 - 154, this.height - 28, 150, 20, CommonComponents.GUI_CANCEL, button -> {
loadFromFile(); loadFromFile();
Objects.requireNonNull(minecraft).setScreen(parent); Objects.requireNonNull(minecraft).setScreen(parent);
})); }));
Button done = addBtn(new Button(this.width / 2 + 4, this.height - 28, 150, 20, CommonComponents.GUI_DONE, (button) -> {
Button done = this.addRenderableWidget(new Button(this.width / 2 + 4, this.height - 28, 150, 20, CommonComponents.GUI_DONE, (button) -> {
saveToFile(); saveToFile();
Objects.requireNonNull(minecraft).setScreen(parent); Objects.requireNonNull(minecraft).setScreen(parent);
})); }));
@@ -753,10 +763,12 @@ public abstract class ConfigGui
// Only for 1.17 and over // Only for 1.17 and over
// Remove in 1.16 and below // Remove in 1.16 and below
#if POST_MC_1_17_1
@Override @Override
public List<? extends NarratableEntry> narratables() public List<? extends NarratableEntry> narratables()
{ {
return children; return children;
} }
#endif
} }
} }
@@ -459,6 +459,17 @@ public class LodConfigWrapperSingleton implements ILodConfigWrapperSingleton
ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.vanillaOverdraw").value = newVanillaOverdraw; ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.vanillaOverdraw").value = newVanillaOverdraw;
ConfigGui.editSingleOption.saveOption("client.graphics.advancedGraphics.vanillaOverdraw"); ConfigGui.editSingleOption.saveOption("client.graphics.advancedGraphics.vanillaOverdraw");
} }
@Override
public int getOverdrawOffset() {
return Config.Client.Graphics.AdvancedGraphics.overdrawOffset;
}
@Override
public void setOverdrawOffset(int newOverdrawOffset) {
ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.overdrawOffset").value = newOverdrawOffset;
ConfigGui.editSingleOption.saveOption("client.graphics.advancedGraphics.overdrawOffset");
}
/* /*
@Override @Override
public int getBacksideCullingRange() public int getBacksideCullingRange()
@@ -507,6 +518,43 @@ public class LodConfigWrapperSingleton implements ILodConfigWrapperSingleton
ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.saturationMultiplier").value = newSaturationMultiplier; ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.saturationMultiplier").value = newSaturationMultiplier;
ConfigGui.editSingleOption.saveOption("client.graphics.advancedGraphics.saturationMultiplier"); ConfigGui.editSingleOption.saveOption("client.graphics.advancedGraphics.saturationMultiplier");
} }
@Override
public boolean getEnableCaveCulling() {
return Config.Client.Graphics.AdvancedGraphics.enableCaveCulling;
}
@Override
public void setEnableCaveCulling(boolean newEnableCaveCulling) {
ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.enableCaveCulling").value = newEnableCaveCulling;
ConfigGui.editSingleOption.saveOption("client.graphics.advancedGraphics.enableCaveCulling");
}
@Override
public int getCaveCullingHeight() {
return Config.Client.Graphics.AdvancedGraphics.caveCullingHeight;
}
@Override
public void setCaveCullingHeight(int newCaveCullingHeight) {
ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.caveCullingHeight").value = newCaveCullingHeight;
ConfigGui.editSingleOption.saveOption("client.graphics.advancedGraphics.caveCullingHeight");
}
@Override
public int getEarthCurveRatio()
{
return (int) ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.earthCurveRatio").value;
}
@Override
public void setEarthCurveRatio(int newEarthCurveRatio)
{
if (newEarthCurveRatio < 50) newEarthCurveRatio = 0;
ConfigGui.editSingleOption.getEntry("client.graphics.advancedGraphics.earthCurveRatio").value = newEarthCurveRatio;
ConfigGui.editSingleOption.saveOption("client.graphics.advancedGraphics.earthCurveRatio");
}
} }
} }
@@ -668,12 +716,12 @@ public class LodConfigWrapperSingleton implements ILodConfigWrapperSingleton
public static class Threading implements IThreading public static class Threading implements IThreading
{ {
@Override @Override
public int getNumberOfWorldGenerationThreads() public double getNumberOfWorldGenerationThreads()
{ {
return Config.Client.Advanced.Threading.numberOfWorldGenerationThreads; return Config.Client.Advanced.Threading.numberOfWorldGenerationThreads;
} }
@Override @Override
public void setNumberOfWorldGenerationThreads(int newNumberOfWorldGenerationThreads) public void setNumberOfWorldGenerationThreads(double newNumberOfWorldGenerationThreads)
{ {
ConfigGui.editSingleOption.getEntry("client.advanced.threading.numberOfWorldGenerationThreads").value = newNumberOfWorldGenerationThreads; ConfigGui.editSingleOption.getEntry("client.advanced.threading.numberOfWorldGenerationThreads").value = newNumberOfWorldGenerationThreads;
ConfigGui.editSingleOption.saveOption("client.advanced.threading.numberOfWorldGenerationThreads"); ConfigGui.editSingleOption.saveOption("client.advanced.threading.numberOfWorldGenerationThreads");
@@ -701,18 +749,28 @@ public class LodConfigWrapperSingleton implements ILodConfigWrapperSingleton
//===============// //===============//
public static class Debugging implements IDebugging public static class Debugging implements IDebugging
{ {
public final IDebugSwitch debugSwitch;
@Override @Override
public boolean getDrawLods() public IDebugSwitch debugSwitch()
{ {
return (boolean) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.drawLods").value; return debugSwitch;
}
@Override
public void setDrawLods(boolean newDrawLods)
{
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.drawLods").value = newDrawLods;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.drawLods");
} }
/* RendererType:
* DEFAULT
* DEBUG
* DISABLED
* */
@Override
public RendererType getRendererType() {
return (RendererType) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.rendererType").value;
}
@Override
public void setRendererType(RendererType newRenderType) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.rendererType").value = newRenderType;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.rendererType");
}
@Override @Override
public DebugMode getDebugMode() public DebugMode getDebugMode()
@@ -738,6 +796,116 @@ public class LodConfigWrapperSingleton implements ILodConfigWrapperSingleton
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.enableDebugKeybindings").value = newEnableDebugKeybindings; ConfigGui.editSingleOption.getEntry("client.advanced.debugging.enableDebugKeybindings").value = newEnableDebugKeybindings;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.enableDebugKeybindings"); ConfigGui.editSingleOption.saveOption("client.advanced.debugging.enableDebugKeybindings");
} }
public Debugging()
{
debugSwitch = new DebugSwitch();
}
public static class DebugSwitch implements IDebugSwitch {
/* The logging switches available:
* WorldGenEvent
* WorldGenPerformance
* WorldGenLoadEvent
* LodBuilderEvent
* RendererBufferEvent
* RendererGLEvent
* FileReadWriteEvent
* FileSubDimEvent
* NetworkEvent //NOT IMPL YET
*/
@Override
public LoggerMode getLogWorldGenEvent() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logWorldGenEvent").value;
}
@Override
public void setLogWorldGenEvent(LoggerMode newLogWorldGenEvent) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logWorldGenEvent").value = newLogWorldGenEvent;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logWorldGenEvent");
}
@Override
public LoggerMode getLogWorldGenPerformance() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logWorldGenPerformance").value;
}
@Override
public void setLogWorldGenPerformance(LoggerMode newLogWorldGenPerformance) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logWorldGenPerformance").value = newLogWorldGenPerformance;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logWorldGenPerformance");
}
@Override
public LoggerMode getLogWorldGenLoadEvent() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logWorldGenLoadEvent").value;
}
@Override
public void setLogWorldGenLoadEvent(LoggerMode newLogWorldGenLoadEvent) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logWorldGenLoadEvent").value = newLogWorldGenLoadEvent;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logWorldGenLoadEvent");
}
@Override
public LoggerMode getLogLodBuilderEvent() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logLodBuilderEvent").value;
}
@Override
public void setLogLodBuilderEvent(LoggerMode newLogLodBuilderEvent) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logLodBuilderEvent").value = newLogLodBuilderEvent;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logLodBuilderEvent");
}
@Override
public LoggerMode getLogRendererBufferEvent() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logRendererBufferEvent").value;
}
@Override
public void setLogRendererBufferEvent(LoggerMode newLogRendererBufferEvent) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logRendererBufferEvent").value = newLogRendererBufferEvent;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logRendererBufferEvent");
}
@Override
public LoggerMode getLogRendererGLEvent() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logRendererGLEvent").value;
}
@Override
public void setLogRendererGLEvent(LoggerMode newLogRendererGLEvent) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logRendererGLEvent").value = newLogRendererGLEvent;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logRendererGLEvent");
}
@Override
public LoggerMode getLogFileReadWriteEvent() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logFileReadWriteEvent").value;
}
@Override
public void setLogFileReadWriteEvent(LoggerMode newLogFileReadWriteEvent) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logFileReadWriteEvent").value = newLogFileReadWriteEvent;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logFileReadWriteEvent");
}
@Override
public LoggerMode getLogFileSubDimEvent() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logFileSubDimEvent").value;
}
@Override
public void setLogFileSubDimEvent(LoggerMode newLogFileSubDimEvent) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logFileSubDimEvent").value = newLogFileSubDimEvent;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logFileSubDimEvent");
}
@Override
public LoggerMode getLogNetworkEvent() {
return (LoggerMode) ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logNetworkEvent").value;
}
@Override
public void setLogNetworkEvent(LoggerMode newLogNetworkEvent) {
ConfigGui.editSingleOption.getEntry("client.advanced.debugging.debugSwitch.logNetworkEvent").value = newLogNetworkEvent;
ConfigGui.editSingleOption.saveOption("client.advanced.debugging.debugSwitch.logNetworkEvent");
}
}
} }
@@ -781,6 +949,18 @@ public class LodConfigWrapperSingleton implements ILodConfigWrapperSingleton
ConfigGui.editSingleOption.saveOption("client.advanced.buffers.newBufferRebuildTimes"); ConfigGui.editSingleOption.saveOption("client.advanced.buffers.newBufferRebuildTimes");
} }
} }
@Override
public boolean getLodOnlyMode() {
return Config.Client.Advanced.lodOnlyMode;
}
@Override
public void setLodOnlyMode(boolean newLodOnlyMode) {
ConfigGui.editSingleOption.getEntry("client.advanced.buffers.lodOnlyMode").value = newLodOnlyMode;
ConfigGui.editSingleOption.saveOption("client.advanced.buffers.lodOnlyMode");
}
} }
} }
} }
@@ -1,7 +1,27 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.config; package com.seibel.lod.common.wrappers.config;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.ImageButton; import net.minecraft.client.gui.components.ImageButton;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
@@ -11,9 +31,12 @@ import net.minecraft.resources.ResourceLocation;
* Creates a button with a texture on it * Creates a button with a texture on it
*/ */
public class TexturedButtonWidget extends ImageButton { public class TexturedButtonWidget extends ImageButton {
#if POST_MC_1_17_1
public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, ResourceLocation texture, OnPress pressAction) { public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, ResourceLocation texture, OnPress pressAction) {
super(x, y, width, height, u, v, texture, pressAction); super(x, y, width, height, u, v, texture, pressAction);
} }
#endif
public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction) { public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction) {
super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction); super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction);
} }
@@ -28,9 +51,15 @@ public class TexturedButtonWidget extends ImageButton {
@Override @Override
public void renderButton(PoseStack matrices, int mouseX, int mouseY, float delta) { public void renderButton(PoseStack matrices, int mouseX, int mouseY, float delta) {
#if PRE_MC_1_17_1
Minecraft.getInstance().getTextureManager().bind(WIDGETS_LOCATION);
RenderSystem.color4f(1.0F, 1.0F, 1.0F, this.alpha);
#else
RenderSystem.setShader(GameRenderer::getPositionTexShader); RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderTexture(0, WIDGETS_LOCATION); RenderSystem.setShaderTexture(0, WIDGETS_LOCATION);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha);
#endif
int i = this.getYImage(this.isHovered); int i = this.getYImage(this.isHovered);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc(); RenderSystem.defaultBlendFunc();
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -59,12 +59,12 @@ import net.minecraft.network.chat.TextComponent;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
/** /**
* A singleton that wraps the Minecraft class * A singleton that wraps the Minecraft object.
* to allow for easier movement between Minecraft versions.
* *
* @author James Seibel * @author James Seibel
* @version 3-5-2022 * @version 3-5-2022
@@ -164,57 +164,6 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper
return LodUtil.getDimensionIDFromWorld(WorldWrapper.getWorldWrapper(mc.level)); return LodUtil.getDimensionIDFromWorld(WorldWrapper.getWorldWrapper(mc.level));
} }
/** This texture changes every frame */
@Override
public ILightMapWrapper getCurrentLightMap()
{
// get the current lightMap if the cache is empty
if (lightMap == null)
{
LightTexture tex = mc.gameRenderer.lightTexture();
lightMap = tex.lightPixels;
}
return new LightMapWrapper(lightMap);
}
/**
* Returns the color int at the given pixel coordinates
* from the current lightmap.
* @param blockLight x location in texture space
* @param skyLight z location in texture space
*/
@Override
public int getColorIntFromLightMap(int blockLight, int skyLight)
{
if (lightMap == null)
{
sendChatMessage("new");
// make sure the lightMap is up-to-date
getCurrentLightMap();
}
return lightMap.getPixelRGBA(blockLight, skyLight);
}
/**
* Returns the Color at the given pixel coordinates
* from the current lightmap.
* @param blockLight x location in texture space
* @param skyLight z location in texture space
*/
@Override
public Color getColorFromLightMap(int blockLight, int skyLight) {
if (lightMap == null) {
// make sure the lightMap is up-to-date
getCurrentLightMap();
}
return LodUtil.intToColor(lightMap.getPixelRGBA(blockLight, skyLight));
}
//=============// //=============//
// Simple gets // // Simple gets //
//=============// //=============//
@@ -240,7 +189,11 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper
@Override @Override
public ChunkPosWrapper getPlayerChunkPos() public ChunkPosWrapper getPlayerChunkPos()
{ {
#if PRE_MC_1_17_1
ChunkPos playerPos = new ChunkPos(getPlayer().blockPosition());
#else
ChunkPos playerPos = getPlayer().chunkPosition(); ChunkPos playerPos = getPlayer().chunkPosition();
#endif
return new ChunkPosWrapper(playerPos.x, playerPos.z); return new ChunkPosWrapper(playerPos.x, playerPos.z);
} }
@@ -374,6 +327,14 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper
return mc.getCurrentServer() != null; return mc.getCurrentServer() != null;
} }
@Override
public int getPlayerSkylight() {
if (mc.level == null) return -1;
if (mc.player == null) return -1;
if (mc.player.blockPosition() == null) return -1;
return mc.level.getBrightness(LightLayer.SKY, mc.player.blockPosition());
}
public ServerData getCurrentServer() public ServerData getCurrentServer()
{ {
return mc.getCurrentServer(); return mc.getCurrentServer();
@@ -1,6 +1,26 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.minecraft; package com.seibel.lod.common.wrappers.minecraft;
import java.awt.*; import java.awt.Color;
import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -15,6 +35,7 @@ import com.seibel.lod.core.handlers.dependencyInjection.ModAccessorHandler;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.util.LodUtil;
import com.seibel.lod.core.wrapperInterfaces.misc.ILightMapWrapper;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
import com.mojang.math.Vector3f; import com.mojang.math.Vector3f;
@@ -40,9 +61,15 @@ import net.minecraft.core.BlockPos;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
#if PRE_MC_1_17_1
import net.minecraft.tags.FluidTags;
import net.minecraft.world.level.material.FluidState;
#else
import net.minecraft.world.level.material.FogType; import net.minecraft.world.level.material.FogType;
#endif
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.lwjgl.opengl.GL15;
/** /**
@@ -60,6 +87,8 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
private static final GameRenderer GAME_RENDERER = MC.gameRenderer; private static final GameRenderer GAME_RENDERER = MC.gameRenderer;
private static final IWrapperFactory FACTORY = WrapperFactory.INSTANCE; private static final IWrapperFactory FACTORY = WrapperFactory.INSTANCE;
public LightMapWrapper lightmap = null;
@Override @Override
public Vec3f getLookAtVector() public Vec3f getLookAtVector()
{ {
@@ -94,7 +123,11 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
@Override @Override
public Mat4f getDefaultProjectionMatrix(float partialTicks) public Mat4f getDefaultProjectionMatrix(float partialTicks)
{ {
#if PRE_MC_1_17_1
return McObjectConverter.Convert(GAME_RENDERER.getProjectionMatrix(GAME_RENDERER.getMainCamera(), partialTicks, true));
#else
return McObjectConverter.Convert(GAME_RENDERER.getProjectionMatrix(GAME_RENDERER.getFov(GAME_RENDERER.getMainCamera(), partialTicks, true))); return McObjectConverter.Convert(GAME_RENDERER.getProjectionMatrix(GAME_RENDERER.getFov(GAME_RENDERER.getMainCamera(), partialTicks, true)));
#endif
} }
@Override @Override
@@ -105,8 +138,14 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
@Override @Override
public Color getFogColor(float partialTicks) { public Color getFogColor(float partialTicks) {
#if PRE_MC_1_17_1
float[] colorValues = new float[4];
GL15.glGetFloatv(GL15.GL_FOG_COLOR, colorValues);
#else
FogRenderer.setupColor(GAME_RENDERER.getMainCamera(), partialTicks, MC.level, 1, GAME_RENDERER.getDarkenWorldAmount(partialTicks)); FogRenderer.setupColor(GAME_RENDERER.getMainCamera(), partialTicks, MC.level, 1, GAME_RENDERER.getDarkenWorldAmount(partialTicks));
float[] colorValues = RenderSystem.getShaderFogColor(); float[] colorValues = RenderSystem.getShaderFogColor();
#endif
return new Color(colorValues[0], colorValues[1], colorValues[2], colorValues[3]); return new Color(colorValues[0], colorValues[1], colorValues[2], colorValues[3]);
} }
// getSpecialFogColor() is the same as getFogColor() // getSpecialFogColor() is the same as getFogColor()
@@ -114,7 +153,11 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
@Override @Override
public Color getSkyColor() { public Color getSkyColor() {
if (MC.level.dimensionType().hasSkyLight()) { if (MC.level.dimensionType().hasSkyLight()) {
#if PRE_MC_1_17_1
Vec3 colorValues = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getBlockPosition(), MC.getFrameTime());
#else
Vec3 colorValues = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getPosition(), MC.getFrameTime()); Vec3 colorValues = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getPosition(), MC.getFrameTime());
#endif
return new Color((float) colorValues.x, (float) colorValues.y, (float) colorValues.z); return new Color((float) colorValues.x, (float) colorValues.y, (float) colorValues.z);
} else } else
return new Color(0, 0, 0); return new Color(0, 0, 0);
@@ -130,7 +173,12 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
@Override @Override
public int getRenderDistance() public int getRenderDistance()
{ {
return MC.options.getEffectiveRenderDistance(); #if PRE_MC_1_18_1
//FIXME: How to resolve this?
return MC.options.renderDistance;
#else
return MC.options.getEffectiveRenderDistance();
#endif
} }
@Override @Override
@@ -170,18 +218,15 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
* <p> * <p>
*/ */
public boolean usingBackupGetVanillaRenderedChunks = true; public boolean usingBackupGetVanillaRenderedChunks = false;
@Override @Override
public HashSet<AbstractChunkPosWrapper> getVanillaRenderedChunks() public HashSet<AbstractChunkPosWrapper> getVanillaRenderedChunks() {
{
ISodiumAccessor sodium = ModAccessorHandler.get(ISodiumAccessor.class); ISodiumAccessor sodium = ModAccessorHandler.get(ISodiumAccessor.class);
if (sodium != null) if (sodium != null) {
{
return sodium.getNormalRenderedChunks(); return sodium.getNormalRenderedChunks();
} }
IOptifineAccessor optifine = ModAccessorHandler.get(IOptifineAccessor.class); IOptifineAccessor optifine = ModAccessorHandler.get(IOptifineAccessor.class);
if (optifine != null) if (optifine != null) {
{
HashSet<AbstractChunkPosWrapper> pos = optifine.getNormalRenderedChunks(); HashSet<AbstractChunkPosWrapper> pos = optifine.getNormalRenderedChunks();
if (pos == null) if (pos == null)
pos = getMaximumRenderedChunks(); pos = getMaximumRenderedChunks();
@@ -190,13 +235,14 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
if (!usingBackupGetVanillaRenderedChunks) { if (!usingBackupGetVanillaRenderedChunks) {
try { try {
LevelRenderer levelRenderer = MC.levelRenderer; LevelRenderer levelRenderer = MC.levelRenderer;
LinkedHashSet<LevelRenderer.RenderChunkInfo> chunks = levelRenderer.renderChunkStorage.get().renderChunks; Collection<LevelRenderer.RenderChunkInfo> chunks =
#if PRE_MC_1_18_1 levelRenderer.renderChunks;
#else levelRenderer.renderChunkStorage.get().renderChunks; #endif
return (chunks.stream().map((chunk) -> { return (chunks.stream().map((chunk) -> {
#if MC_VERSION_1_18_2 AABB chunkBoundingBox =
AABB chunkBoundingBox = chunk.chunk.getBoundingBox(); #if PRE_MC_1_18_2 chunk.chunk.bb;
#elif MC_VERSION_1_18_1 #else chunk.chunk.getBoundingBox(); #endif
AABB chunkBoundingBox = chunk.chunk.bb;
#endif
return FACTORY.createChunkPos(Math.floorDiv((int) chunkBoundingBox.minX, 16), return FACTORY.createChunkPos(Math.floorDiv((int) chunkBoundingBox.minX, 16),
Math.floorDiv((int) chunkBoundingBox.minZ, 16)); Math.floorDiv((int) chunkBoundingBox.minZ, 16));
}).collect(Collectors.toCollection(HashSet::new))); }).collect(Collectors.toCollection(HashSet::new)));
@@ -207,7 +253,8 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
+ " Using Backup Method."); + " Using Backup Method.");
MinecraftClientWrapper.INSTANCE.sendChatMessage( MinecraftClientWrapper.INSTANCE.sendChatMessage(
"\u00A7eOverdraw prevention will be worse than normal."); "\u00A7eOverdraw prevention will be worse than normal.");
} catch (Exception e2) {} } catch (Exception e2) {
}
ApiShared.LOGGER.error("getVanillaRenderedChunks Error: ", e); ApiShared.LOGGER.error("getVanillaRenderedChunks Error: ", e);
usingBackupGetVanillaRenderedChunks = true; usingBackupGetVanillaRenderedChunks = true;
} }
@@ -216,113 +263,36 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
} }
@Override @Override
public int[] getLightmapPixels() public ILightMapWrapper getLightmapWrapper() {
{ return lightmap;
LightTexture tex = GAME_RENDERER.lightTexture();
tex.tick(); // This call makes no sense, but it fixes pause menu flicker bug
NativeImage lightMapPixels = tex.lightPixels;
LightMapWrapper lightMap = new LightMapWrapper(lightMapPixels);
int lightMapHeight = getLightmapTextureHeight();
int lightMapWidth = getLightmapTextureWidth();
int[] pixels = new int[lightMapWidth * lightMapHeight];
for (int u = 0; u < lightMapWidth; u++)
{
for (int v = 0; v < lightMapWidth; v++)
{
// this could probably be kept as a int, but
// it is easier to test and see the colors when debugging this way.
// When creating a new release this should be changed to the int version.
Color c = LodUtil.intToColor(lightMap.getLightValue(u, v));
// these should both create a totally white image
// int col =
// Integer.MAX_VALUE;
// int col =
// 0b11111111 + // red
// (0b11111111 << 8) + // green
// (0b11111111 << 16) + // blue
// (0b11111111 << 24); // blue
int col =
((c.getRed() & 0xFF) << 16) | // blue
((c.getGreen() & 0xFF) << 8) | // green
((c.getBlue() & 0xFF)) | // red
((c.getAlpha() & 0xFF) << 24); // alpha
// 2D array stored in a 1D array.
// Thank you Tim from College ;)
pixels[u * lightMapWidth + v] = col;
}
}
return pixels;
}
@Override
public int getLightmapTextureHeight()
{
int height = -1;
LightTexture lightTexture = GAME_RENDERER.lightTexture();
if (lightTexture != null)
{
NativeImage tex = lightTexture.lightPixels;
if (tex != null)
{
height = tex.getHeight();
}
}
return height;
}
@Override
public int getLightmapTextureWidth()
{
int width = -1;
LightTexture lightTexture = GAME_RENDERER.lightTexture();
if (lightTexture != null)
{
NativeImage tex = lightTexture.lightPixels;
if (tex != null)
{
width = tex.getWidth();
}
}
return width;
}
@Override
public int getLightmapGLFormat() {
int glFormat = -1;
LightTexture lightTexture = GAME_RENDERER.lightTexture();
if (lightTexture != null) {
NativeImage tex = lightTexture.lightPixels;
if (tex != null) {
glFormat = tex.format().glFormat();
}
}
return glFormat;
} }
@Override @Override
public boolean isFogStateSpecial() { public boolean isFogStateSpecial() {
#if PRE_MC_1_17_1
Camera camera = GAME_RENDERER.getMainCamera();
FluidState fluidState = camera.getFluidInCamera();
Entity entity = camera.getEntity();
boolean isUnderWater = (entity instanceof LivingEntity) && ((LivingEntity)entity).hasEffect(MobEffects.BLINDNESS);
isUnderWater |= fluidState.is(FluidTags.WATER);
isUnderWater |= fluidState.is(FluidTags.LAVA);
return isUnderWater;
#else
Entity entity = GAME_RENDERER.getMainCamera().getEntity(); Entity entity = GAME_RENDERER.getMainCamera().getEntity();
boolean isBlind = (entity instanceof LivingEntity) && ((LivingEntity)entity).hasEffect(MobEffects.BLINDNESS); boolean isBlind = (entity instanceof LivingEntity) && ((LivingEntity)entity).hasEffect(MobEffects.BLINDNESS);
return GAME_RENDERER.getMainCamera().getFluidInCamera() != FogType.NONE || isBlind; return GAME_RENDERER.getMainCamera().getFluidInCamera() != FogType.NONE || isBlind;
#endif
} }
@Override @Override
public boolean tryDisableVanillaFog() { public boolean tryDisableVanillaFog() {
return true; // Handled via MixinFogRenderer in both forge and fabric return true; // Handled via MixinFogRenderer in both forge and fabric
} }
public void updateLightmap(NativeImage lightPixels) {
if (lightmap== null) {
lightmap = new LightMapWrapper();
}
lightmap.uploadLightmap(lightPixels);
}
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.minecraft; package com.seibel.lod.common.wrappers.minecraft;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper;
@@ -1,7 +1,31 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.misc; package com.seibel.lod.common.wrappers.misc;
import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.NativeImage;
import com.seibel.lod.core.wrapperInterfaces.misc.ILightMapWrapper; import com.seibel.lod.core.wrapperInterfaces.misc.ILightMapWrapper;
import net.minecraft.client.renderer.LightTexture;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GL32;
import java.nio.ByteBuffer;
/** /**
* @author James Seibel * @author James Seibel
@@ -9,21 +33,39 @@ import com.seibel.lod.core.wrapperInterfaces.misc.ILightMapWrapper;
*/ */
public class LightMapWrapper implements ILightMapWrapper public class LightMapWrapper implements ILightMapWrapper
{ {
static NativeImage lightMap = null; private int textureId = 0;
public LightMapWrapper(NativeImage newLightMap) public LightMapWrapper()
{ {
lightMap = newLightMap;
} }
public static void setLightMap(NativeImage newLightMap) private void createLightmap(NativeImage image)
{ {
lightMap = newLightMap; textureId = GL32.glGenTextures();
GL32.glBindTexture(GL32.GL_TEXTURE_2D, textureId);
GL32.glTexImage2D(GL32.GL_TEXTURE_2D, 0, image.format().glFormat(), image.getWidth(), image.getHeight(),
0, image.format().glFormat(), GL32.GL_UNSIGNED_BYTE, (ByteBuffer) null);
}
public void uploadLightmap(NativeImage image)
{
int currentBind = GL32.glGetInteger(GL32.GL_TEXTURE_BINDING_2D);
GL32.glBindTexture(GL32.GL_TEXTURE_2D, textureId);
if (textureId == 0) {
createLightmap(image);
}
// NativeImage::upload(int levelOfDetail, int xOffset, int yOffset, bool shouldCleanup?)
image.upload(0, 0, 0, false);
GL32.glBindTexture(GL32.GL_TEXTURE_2D, currentBind);
} }
@Override @Override
public int getLightValue(int skyLight, int blockLight) public void bind() {
{ GL32.glBindTexture(GL32.GL_TEXTURE_2D, textureId);
return lightMap.getPixelRGBA(skyLight, blockLight); }
@Override
public void unbind() {
GL32.glBindTexture(GL32.GL_TEXTURE_2D, 0);
} }
} }
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -110,9 +110,11 @@ public class BiomeWrapper implements IBiomeWrapper
case SAVANNA: case SAVANNA:
case SWAMP: case SWAMP:
default: default:
Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z)); colorInt = biome.getGrassColor(x,z);
tmp = tmp.darker(); //FIXME: Repair what James did - LeeTom
colorInt = LodUtil.colorToInt(tmp); // Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z));
// tmp = tmp.darker();
// colorInt = LodUtil.colorToInt(tmp);
break; break;
} }
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -138,7 +138,11 @@ public class WorldWrapper implements IWorldWrapper
@Override @Override
public short getMinHeight() public short getMinHeight()
{ {
#if PRE_MC_1_17_1
return (short) 0;
#else
return (short) world.getMinBuildHeight(); return (short) world.getMinBuildHeight();
#endif
} }
/** @throws UnsupportedOperationException if the WorldWrapper isn't for a ServerWorld */ /** @throws UnsupportedOperationException if the WorldWrapper isn't for a ServerWorld */
@@ -182,6 +186,4 @@ public class WorldWrapper implements IWorldWrapper
ChunkSource source = world.getChunkSource(); ChunkSource source = world.getChunkSource();
return source.hasChunk(chunkX, chunkZ); return source.hasChunk(chunkX, chunkZ);
} }
} }
@@ -1,8 +1,9 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2021 Tom Lee (TomTheFurry) * Copyright (C) 2021 Tom Lee (TomTheFurry)
* Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -17,9 +18,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.seibel.lod.common.wrappers.worldGeneration; package com.seibel.lod.common.wrappers.worldGeneration;
import com.seibel.lod.core.api.ApiShared; import com.seibel.lod.core.logging.ConfigBasedLogger;
import com.seibel.lod.core.logging.ConfigBasedSpamLogger;
import com.seibel.lod.core.builders.lodBuilding.LodBuilder; import com.seibel.lod.core.builders.lodBuilding.LodBuilder;
import com.seibel.lod.core.builders.lodBuilding.LodBuilderConfig; import com.seibel.lod.core.builders.lodBuilding.LodBuilderConfig;
import com.seibel.lod.core.enums.config.DistanceGenerationMode; import com.seibel.lod.core.enums.config.DistanceGenerationMode;
@@ -70,6 +73,7 @@ import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.lighting.LevelLightEngine; import net.minecraft.world.level.lighting.LevelLightEngine;
import org.apache.logging.log4j.LogManager;
/* /*
Total: 3.135214124s Total: 3.135214124s
@@ -87,9 +91,17 @@ Lod Generation: 0.269023348s
public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnvionmentWrapper public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnvionmentWrapper
{ {
public static final boolean ENABLE_PERF_LOGGING = false; private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
public static final boolean ENABLE_EVENT_LOGGING = false; public static final ConfigBasedSpamLogger PREF_LOGGER =
public static final boolean ENABLE_LOAD_EVENT_LOGGING = false; new ConfigBasedSpamLogger(LogManager.getLogger("LodWorldGen"),
() -> CONFIG.client().advanced().debugging().debugSwitch().getLogWorldGenPerformance(),1);
public static final ConfigBasedLogger EVENT_LOGGER =
new ConfigBasedLogger(LogManager.getLogger("LodWorldGen"),
() -> CONFIG.client().advanced().debugging().debugSwitch().getLogWorldGenEvent());
public static final ConfigBasedLogger LOAD_LOGGER =
new ConfigBasedLogger(LogManager.getLogger("LodWorldGen"),
() -> CONFIG.client().advanced().debugging().debugSwitch().getLogWorldGenLoadEvent());
//TODO: Make actual proper support for StarLight //TODO: Make actual proper support for StarLight
public static class PrefEvent public static class PrefEvent
@@ -224,7 +236,6 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
public final StepLight stepLight = new StepLight(this); public final StepLight stepLight = new StepLight(this);
public boolean unsafeThreadingRecorded = false; public boolean unsafeThreadingRecorded = false;
//public boolean safeMode = false; //public boolean safeMode = false;
private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class); private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class);
public static final long EXCEPTION_TIMER_RESET_TIME = TimeUnit.NANOSECONDS.convert(1, TimeUnit.SECONDS); public static final long EXCEPTION_TIMER_RESET_TIME = TimeUnit.NANOSECONDS.convert(1, TimeUnit.SECONDS);
public static final int EXCEPTION_COUNTER_TRIGGER = 20; public static final int EXCEPTION_COUNTER_TRIGGER = 20;
@@ -245,13 +256,12 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
} }
public ExecutorService executors = Executors.newFixedThreadPool( public ExecutorService executors = Executors.newFixedThreadPool(
CONFIG.client().advanced().threading().getNumberOfWorldGenerationThreads(), threadFactory); CONFIG.client().advanced().threading()._getWorldGenerationThreadPoolSize(), threadFactory);
public <T> T joinSync(CompletableFuture<T> f) { public <T> T joinSync(CompletableFuture<T> f) {
if (!unsafeThreadingRecorded && !f.isDone()) { if (!unsafeThreadingRecorded && !f.isDone()) {
MC.sendChatMessage("\u00A74\u00A7l\u00A7uERROR: Distant Horizons: Unsafe Threading in Chunk Generator Detected!"); EVENT_LOGGER.error("Unsafe Threading in Chunk Generator: ", new RuntimeException("Concurrent future"));
MC.sendChatMessage("\u00A7eTo increase stability, it is recommended to set world generation threads count to 1."); EVENT_LOGGER.error("To increase stability, it is recommended to set world generation threads count to 1.");
ApiShared.LOGGER.error("Unsafe Threading in Chunk Generator: ", new RuntimeException("Concurrent future"));
unsafeThreadingRecorded = true; unsafeThreadingRecorded = true;
} }
return f.join(); return f.join();
@@ -263,7 +273,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
new LodThreadFactory("Gen-Worker-Thread", Thread.MIN_PRIORITY)); new LodThreadFactory("Gen-Worker-Thread", Thread.MIN_PRIORITY));
} }
public boolean tryAddPoint(int px, int pz, int range, Steps target, boolean genAllDetails) public boolean tryAddPoint(int px, int pz, int range, Steps target, boolean genAllDetails, double runTimeRatio)
{ {
int boxSize = range * 2 + 1; int boxSize = range * 2 + 1;
int x = Math.floorDiv(px, boxSize) * boxSize + range; int x = Math.floorDiv(px, boxSize) * boxSize + range;
@@ -275,7 +285,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
return false; return false;
} }
// System.out.println(x + ", "+z); // System.out.println(x + ", "+z);
events.add(new GenerationEvent(new ChunkPos(x, z), range, this, target, genAllDetails)); events.add(new GenerationEvent(new ChunkPos(x, z), range, this, target, genAllDetails, runTimeRatio));
return true; return true;
} }
@@ -300,8 +310,8 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
} }
catch (Throwable e) catch (Throwable e)
{ {
ApiShared.LOGGER.error("Batching World Generator: Event {} gotten an exception", event); EVENT_LOGGER.error("Batching World Generator: Event {} gotten an exception", event);
ApiShared.LOGGER.error("Exception: ", e); EVENT_LOGGER.error("Exception: ", e);
unknownExceptionCount++; unknownExceptionCount++;
lastExceptionTriggerTime = System.nanoTime(); lastExceptionTriggerTime = System.nanoTime();
} }
@@ -312,12 +322,12 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
} }
else if (event.hasTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)) else if (event.hasTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS))
{ {
ApiShared.LOGGER.error("Batching World Generator: " + event + " timed out and terminated!"); EVENT_LOGGER.error("Batching World Generator: " + event + " timed out and terminated!");
ApiShared.LOGGER.info("Dump PrefEvent: " + event.pEvent); EVENT_LOGGER.info("Dump PrefEvent: " + event.pEvent);
try try
{ {
if (!event.terminate()) if (!event.terminate())
ApiShared.LOGGER.error("Failed to terminate the stuck generation event!"); EVENT_LOGGER.error("Failed to terminate the stuck generation event!");
} }
finally finally
{ {
@@ -326,10 +336,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
} }
} }
if (unknownExceptionCount > EXCEPTION_COUNTER_TRIGGER) { if (unknownExceptionCount > EXCEPTION_COUNTER_TRIGGER) {
try { EVENT_LOGGER.error("Too many exceptions in Batching World Generator! Disabling the generator.");
MC.sendChatMessage("\u00A74\u00A7l\u00A7uERROR: Distant Horizons: Too many exceptions in Batching World Generator! Disabling the generator.");
} catch (Exception e) {}
ApiShared.LOGGER.error("Too many exceptions in Batching World Generator! Now disabling.");
unknownExceptionCount = 0; unknownExceptionCount = 0;
CONFIG.client().worldGenerator().setEnableDistantGeneration(false); CONFIG.client().worldGenerator().setEnableDistantGeneration(false);
} }
@@ -338,14 +345,18 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
public BatchGenerationEnvironment(IWorldWrapper serverlevel, LodBuilder lodBuilder, LodDimension lodDim) public BatchGenerationEnvironment(IWorldWrapper serverlevel, LodBuilder lodBuilder, LodDimension lodDim)
{ {
super(serverlevel, lodBuilder, lodDim); super(serverlevel, lodBuilder, lodDim);
ApiShared.LOGGER.info("================WORLD_GEN_STEP_INITING============="); EVENT_LOGGER.info("================WORLD_GEN_STEP_INITING=============");
ChunkGenerator generator = ((WorldWrapper) serverlevel).getServerWorld().getChunkSource().getGenerator(); ChunkGenerator generator = ((WorldWrapper) serverlevel).getServerWorld().getChunkSource().getGenerator();
if (!(generator instanceof NoiseBasedChunkGenerator || if (!(generator instanceof NoiseBasedChunkGenerator ||
generator instanceof DebugLevelSource || generator instanceof DebugLevelSource ||
generator instanceof FlatLevelSource)) { generator instanceof FlatLevelSource)) {
MC.sendChatMessage("\u00A74\u00A7l\u00A7uWARNING: Distant Horizons: Unknown Chunk Generator Detected! Distant Generation May Fail!"); if (generator.getClass().toString().equals("class com.terraforged.mod.chunk.TFChunkGenerator")) {
MC.sendChatMessage("\u00A7eIf it does crash, set Distant Generation to OFF or Generation Mode to None."); EVENT_LOGGER.info("TerraForge Chunk Generator detected: [{}], Distant Generation will try its best to support it.", generator.getClass());
ApiShared.LOGGER.warn("Unknown Chunk Generator detected: {}", generator.getClass()); EVENT_LOGGER.info("If it does crash, set Distant Generation to OFF or Generation Mode to None.");
} else {
EVENT_LOGGER.warn("Unknown Chunk Generator detected: [{}], Distant Generation May Fail!", generator.getClass());
EVENT_LOGGER.warn("If it does crash, set Distant Generation to OFF or Generation Mode to None.");
}
} }
params = new GlobalParameters((ServerLevel) ((WorldWrapper) serverlevel).getWorld(), lodBuilder, lodDim); params = new GlobalParameters((ServerLevel) ((WorldWrapper) serverlevel).getWorld(), lodBuilder, lodDim);
} }
@@ -360,19 +371,25 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
} }
catch (Exception e) catch (Exception e)
{ {
ApiShared.LOGGER.error("DistantHorizons: Couldn't load chunk {}", chunkPos, e); LOAD_LOGGER.error("DistantHorizons: Couldn't load chunk {}", chunkPos, e);
} }
if (chunkData == null) if (chunkData == null)
{ {
return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), null); return new ProtoChunk(chunkPos, UpgradeData.EMPTY
#if POST_MC_1_17_1, level #endif
#if POST_MC_1_18_1, level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), null #endif
);
} }
else else
{ {
try { try {
return ChunkLoader.read(level, lightEngine, chunkPos, chunkData); return ChunkLoader.read(level, lightEngine, chunkPos, chunkData);
} catch (Exception e) { } catch (Exception e) {
ApiShared.LOGGER.error("DistantHorizons: Couldn't load chunk {}", chunkPos, e); LOAD_LOGGER.error("DistantHorizons: Couldn't load chunk {}", chunkPos, e);
return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), null); return new ProtoChunk(chunkPos, UpgradeData.EMPTY
#if POST_MC_1_17_1, level #endif
#if POST_MC_1_18_1, level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), null #endif
);
} }
} }
@@ -380,8 +397,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
public void generateLodFromList(GenerationEvent e) public void generateLodFromList(GenerationEvent e)
{ {
if (ENABLE_EVENT_LOGGING) EVENT_LOGGER.debug("Lod Generate Event: " + e.pos);
ApiShared.LOGGER.info("Lod Generate Event: " + e.pos);
e.pEvent.beginNano = System.nanoTime(); e.pEvent.beginNano = System.nanoTime();
ArrayGridList<ChunkAccess> referencedChunks; ArrayGridList<ChunkAccess> referencedChunks;
ArrayGridList<ChunkAccess> genChunks; ArrayGridList<ChunkAccess> genChunks;
@@ -411,8 +427,10 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
// Continue... // Continue...
} }
if (target == null) if (target == null)
target = new ProtoChunk(chunkPos, UpgradeData.EMPTY, params.level, target = new ProtoChunk(chunkPos, UpgradeData.EMPTY
params.biomes, null); #if POST_MC_1_17_1, params.level #endif
#if POST_MC_1_18_1, params.biomes, null #endif
);
return target; return target;
}; };
@@ -424,7 +442,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
region = new LightedWorldGenRegion(params.level, lightEngine, referencedChunks, region = new LightedWorldGenRegion(params.level, lightEngine, referencedChunks,
ChunkStatus.STRUCTURE_STARTS, refRange, e.lightMode, generator); ChunkStatus.STRUCTURE_STARTS, refRange, e.lightMode, generator);
adaptor.setRegion(region); adaptor.setRegion(region);
e.tParam.makeStructFeat(region); e.tParam.makeStructFeat(region, params);
genChunks = new ArrayGridList<>(referencedChunks, RANGE_TO_RANGE_EMPTY_EXTENSION, genChunks = new ArrayGridList<>(referencedChunks, RANGE_TO_RANGE_EMPTY_EXTENSION,
referencedChunks.gridSize - RANGE_TO_RANGE_EMPTY_EXTENSION); referencedChunks.gridSize - RANGE_TO_RANGE_EMPTY_EXTENSION);
generateDirect(e, genChunks, e.target, region); generateDirect(e, genChunks, e.target, region);
@@ -471,21 +489,23 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
} }
boolean isFull = target.getStatus() == ChunkStatus.FULL || target instanceof LevelChunk; boolean isFull = target.getStatus() == ChunkStatus.FULL || target instanceof LevelChunk;
#if POST_MC_1_18_1
boolean isPartial = target.isOldNoiseGeneration(); boolean isPartial = target.isOldNoiseGeneration();
#endif
if (isFull) if (isFull)
{ {
if (ENABLE_LOAD_EVENT_LOGGING) LOAD_LOGGER.info("Detected full existing chunk at {}", target.getPos());
ApiShared.LOGGER.info("Detected full existing chunk at {}", target.getPos());
params.lodBuilder.generateLodNodeFromChunk(params.lodDim, wrappedChunk, params.lodBuilder.generateLodNodeFromChunk(params.lodDim, wrappedChunk,
new LodBuilderConfig(DistanceGenerationMode.FULL), true, e.genAllDetails); new LodBuilderConfig(DistanceGenerationMode.FULL), true, e.genAllDetails);
} }
#if POST_MC_1_18_1
else if (isPartial) else if (isPartial)
{ {
if (ENABLE_LOAD_EVENT_LOGGING) LOAD_LOGGER.info("Detected old existing chunk at {}", target.getPos());
ApiShared.LOGGER.info("Detected old existing chunk at {}", target.getPos());
params.lodBuilder.generateLodNodeFromChunk(params.lodDim, wrappedChunk, params.lodBuilder.generateLodNodeFromChunk(params.lodDim, wrappedChunk,
new LodBuilderConfig(generationMode), true, e.genAllDetails); new LodBuilderConfig(generationMode), true, e.genAllDetails);
} }
#endif
else if (target.getStatus() == ChunkStatus.EMPTY && generationMode == DistanceGenerationMode.NONE) else if (target.getStatus() == ChunkStatus.EMPTY && generationMode == DistanceGenerationMode.NONE)
{ {
params.lodBuilder.generateLodNodeFromChunk(params.lodDim,wrappedChunk, params.lodBuilder.generateLodNodeFromChunk(params.lodDim,wrappedChunk,
@@ -505,10 +525,10 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
} }
e.pEvent.endNano = System.nanoTime(); e.pEvent.endNano = System.nanoTime();
e.refreshTimeout(); e.refreshTimeout();
if (ENABLE_PERF_LOGGING) if (PREF_LOGGER.canMaybeLog())
{ {
e.tParam.perf.recordEvent(e.pEvent); e.tParam.perf.recordEvent(e.pEvent);
ApiShared.LOGGER.info(e.tParam.perf); PREF_LOGGER.infoInc("{}", e.tParam.perf);
} }
} }
@@ -570,10 +590,12 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
{ {
if (p instanceof ProtoChunk) if (p instanceof ProtoChunk)
((ProtoChunk) p).setLightCorrect(true); ((ProtoChunk) p).setLightCorrect(true);
#if POST_MC_1_18_1
if (p instanceof LevelChunk) { if (p instanceof LevelChunk) {
((LevelChunk) p).setLightCorrect(true); ((LevelChunk) p).setLightCorrect(true);
((LevelChunk) p).setClientLightReady(true); ((LevelChunk) p).setClientLightReady(true);
} }
#endif
}); });
break; break;
} }
@@ -594,14 +616,14 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
@Override @Override
public void stop(boolean blocking) { public void stop(boolean blocking) {
ApiShared.LOGGER.info("Batch Chunk Generator shutting down..."); EVENT_LOGGER.info("Batch Chunk Generator shutting down...");
executors.shutdownNow(); executors.shutdownNow();
if (blocking) try { if (blocking) try {
if (!executors.awaitTermination(10, TimeUnit.SECONDS)) { if (!executors.awaitTermination(10, TimeUnit.SECONDS)) {
ApiShared.LOGGER.error("Batch Chunk Generator shutdown failed! Ignoring child threads..."); EVENT_LOGGER.error("Batch Chunk Generator shutdown failed! Ignoring child threads...");
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
ApiShared.LOGGER.error("Batch Chunk Generator shutdown failed! Ignoring child threads...", e); EVENT_LOGGER.error("Batch Chunk Generator shutdown failed! Ignoring child threads...", e);
} }
} }
} }
@@ -1,3 +1,21 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration; package com.seibel.lod.common.wrappers.worldGeneration;
@@ -25,16 +43,19 @@ public final class GenerationEvent
final ChunkPos pos; final ChunkPos pos;
final int range; final int range;
final Future<?> future; final Future<?> future;
long nanotime; long creationNanotime;
final int id; final int id;
final Steps target; final Steps target;
final LightGenerationMode lightMode; final LightGenerationMode lightMode;
final PrefEvent pEvent = new PrefEvent(); final PrefEvent pEvent = new PrefEvent();
final boolean genAllDetails; final boolean genAllDetails;
public GenerationEvent(ChunkPos pos, int range, BatchGenerationEnvironment generationGroup, Steps target, boolean genAllDetails) final double runTimeRatio;
public GenerationEvent(ChunkPos pos, int range, BatchGenerationEnvironment generationGroup,
Steps target, boolean genAllDetails, double runTimeRatio)
{ {
nanotime = System.nanoTime(); creationNanotime = System.nanoTime();
this.pos = pos; this.pos = pos;
this.range = range; this.range = range;
id = generationFutureDebugIDs++; id = generationFutureDebugIDs++;
@@ -44,14 +65,24 @@ public final class GenerationEvent
this.lightMode = mode; this.lightMode = mode;
this.genAllDetails = genAllDetails; this.genAllDetails = genAllDetails;
this.runTimeRatio = runTimeRatio;
future = generationGroup.executors.submit(() -> future = generationGroup.executors.submit(() ->
{ {
long startTime = System.nanoTime();
BatchGenerationEnvironment.isDistantGeneratorThread.set(true); BatchGenerationEnvironment.isDistantGeneratorThread.set(true);
try { try {
generationGroup.generateLodFromList(this); generationGroup.generateLodFromList(this);
} finally { } finally {
BatchGenerationEnvironment.isDistantGeneratorThread.remove(); BatchGenerationEnvironment.isDistantGeneratorThread.remove();
if (!Thread.interrupted() && runTimeRatio < 1.0) {
long endTime = System.nanoTime();
try {
long deltaMs = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);
Thread.sleep((long) (deltaMs/runTimeRatio - deltaMs));
} catch (InterruptedException ignored) {
}
}
} }
}); });
} }
@@ -64,7 +95,7 @@ public final class GenerationEvent
public boolean hasTimeout(int duration, TimeUnit unit) public boolean hasTimeout(int duration, TimeUnit unit)
{ {
long currentTime = System.nanoTime(); long currentTime = System.nanoTime();
long delta = currentTime - nanotime; long delta = currentTime - creationNanotime;
return (delta > TimeUnit.NANOSECONDS.convert(duration, unit)); return (delta > TimeUnit.NANOSECONDS.convert(duration, unit));
} }
@@ -99,7 +130,7 @@ public final class GenerationEvent
public void refreshTimeout() public void refreshTimeout()
{ {
nanotime = System.nanoTime(); creationNanotime = System.nanoTime();
LodUtil.checkInterruptsUnchecked(); LodUtil.checkInterruptsUnchecked();
} }
@@ -1,9 +1,26 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration; package com.seibel.lod.common.wrappers.worldGeneration;
import com.mojang.datafixers.DataFixer; import com.mojang.datafixers.DataFixer;
import com.seibel.lod.core.builders.lodBuilding.LodBuilder; import com.seibel.lod.core.builders.lodBuilding.LodBuilder;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.objects.lod.LodDimension; import com.seibel.lod.core.objects.lod.LodDimension;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
@@ -14,10 +31,9 @@ import net.minecraft.server.level.ThreadedLevelLightEngine;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.biome.BiomeManager;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
#if POST_MC_1_18_1
import net.minecraft.world.level.chunk.storage.ChunkScanAccess; import net.minecraft.world.level.chunk.storage.ChunkScanAccess;
import net.minecraft.world.level.levelgen.DebugLevelSource; #endif
import net.minecraft.world.level.levelgen.FlatLevelSource;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.WorldGenSettings;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager;
import net.minecraft.world.level.storage.WorldData; import net.minecraft.world.level.storage.WorldData;
@@ -26,7 +42,6 @@ public final class GlobalParameters
{ {
public final ChunkGenerator generator; public final ChunkGenerator generator;
public final StructureManager structures; public final StructureManager structures;
public final BiomeManager biomeManager;
public final WorldGenSettings worldGenSettings; public final WorldGenSettings worldGenSettings;
public final ThreadedLevelLightEngine lightEngine; public final ThreadedLevelLightEngine lightEngine;
public final LodBuilder lodBuilder; public final LodBuilder lodBuilder;
@@ -34,9 +49,12 @@ public final class GlobalParameters
public final Registry<Biome> biomes; public final Registry<Biome> biomes;
public final RegistryAccess registry; public final RegistryAccess registry;
public final long worldSeed; public final long worldSeed;
public final ChunkScanAccess chunkScanner;
public final ServerLevel level; // TODO: Figure out a way to remove this. Maybe ClientLevel also works? public final ServerLevel level; // TODO: Figure out a way to remove this. Maybe ClientLevel also works?
public final DataFixer fixerUpper; public final DataFixer fixerUpper;
#if POST_MC_1_18_1
public final BiomeManager biomeManager;
public final ChunkScanAccess chunkScanner; // FIXME: Figure out if this is actually needed
#endif
public GlobalParameters(ServerLevel level, LodBuilder lodBuilder, LodDimension lodDim) public GlobalParameters(ServerLevel level, LodBuilder lodBuilder, LodDimension lodDim)
{ {
@@ -50,10 +68,12 @@ public final class GlobalParameters
registry = server.registryAccess(); registry = server.registryAccess();
biomes = registry.registryOrThrow(Registry.BIOME_REGISTRY); biomes = registry.registryOrThrow(Registry.BIOME_REGISTRY);
worldSeed = worldGenSettings.seed(); worldSeed = worldGenSettings.seed();
#if POST_MC_1_18_1
biomeManager = new BiomeManager(level, BiomeManager.obfuscateSeed(worldSeed)); biomeManager = new BiomeManager(level, BiomeManager.obfuscateSeed(worldSeed));
chunkScanner = level.getChunkSource().chunkScanner();
#endif
structures = server.getStructureManager(); structures = server.getStructureManager();
generator = level.getChunkSource().getGenerator(); generator = level.getChunkSource().getGenerator();
chunkScanner = level.getChunkSource().chunkScanner();
fixerUpper = server.getFixerUpper(); fixerUpper = server.getFixerUpper();
} }
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration; package com.seibel.lod.common.wrappers.worldGeneration;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration; package com.seibel.lod.common.wrappers.worldGeneration;
@@ -6,14 +25,19 @@ import com.seibel.lod.common.wrappers.worldGeneration.mimicObject.WorldGenStruct
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.levelgen.WorldGenSettings;
#if POST_MC_1_18_1
import net.minecraft.world.level.levelgen.structure.StructureCheck; import net.minecraft.world.level.levelgen.structure.StructureCheck;
#endif
public final class ThreadedParameters public final class ThreadedParameters
{ {
private static final ThreadLocal<ThreadedParameters> localParam = new ThreadLocal<ThreadedParameters>(); private static final ThreadLocal<ThreadedParameters> localParam = new ThreadLocal<ThreadedParameters>();
final ServerLevel level; final ServerLevel level;
public final WorldGenStructFeatManager structFeat; public WorldGenStructFeatManager structFeat = null;
#if POST_MC_1_18_1
public final StructureCheck structCheck; public final StructureCheck structCheck;
#endif
boolean isValid = true; boolean isValid = true;
public final PerfCalculator perf = new PerfCalculator(); public final PerfCalculator perf = new PerfCalculator();
@@ -35,14 +59,17 @@ public final class ThreadedParameters
private ThreadedParameters(GlobalParameters param) private ThreadedParameters(GlobalParameters param)
{ {
level = param.level; level = param.level;
#if PRE_MC_1_18_1
structFeat = new WorldGenStructFeatManager(param.worldGenSettings, level);
#else
structCheck = new StructureCheck(param.chunkScanner, param.registry, param.structures, structCheck = new StructureCheck(param.chunkScanner, param.registry, param.structures,
param.level.dimension(), param.generator, level, param.generator.getBiomeSource(), param.worldSeed, param.level.dimension(), param.generator, level, param.generator.getBiomeSource(), param.worldSeed,
param.fixerUpper); param.fixerUpper);
structFeat = new WorldGenStructFeatManager(level, param.worldGenSettings, null, structCheck); #endif
} }
public void makeStructFeat(WorldGenLevel genLevel) public void makeStructFeat(WorldGenLevel genLevel, GlobalParameters param)
{ {
structFeat.setGenLevel(genLevel); structFeat = new WorldGenStructFeatManager(param.worldGenSettings, genLevel #if POST_MC_1_18_1, structCheck #endif);
} }
} }
@@ -1,12 +1,31 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.mimicObject; package com.seibel.lod.common.wrappers.worldGeneration.mimicObject;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.Dynamic; import com.mojang.serialization.Dynamic;
import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment;
import com.seibel.lod.core.api.ApiShared; import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.logging.ConfigBasedLogger;
import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import it.unimi.dsi.fastutil.longs.LongSet; import it.unimi.dsi.fastutil.longs.LongSet;
import java.util.Arrays; import java.util.Arrays;
@@ -15,11 +34,6 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
#if MC_VERSION_1_18_2
import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
#endif
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.SectionPos; import net.minecraft.core.SectionPos;
@@ -27,40 +41,46 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtOps;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.*;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.WorldGenLevel;
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.biome.Biomes;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.*;
import net.minecraft.world.level.chunk.DataLayer; import net.minecraft.world.level.chunk.storage.ChunkSerializer;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.chunk.LevelChunkSection;
import net.minecraft.world.level.chunk.PalettedContainer;
import net.minecraft.world.level.chunk.UpgradeData;
import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap;
#if POST_MC_1_18_1
import net.minecraft.world.level.levelgen.blending.BlendingData; import net.minecraft.world.level.levelgen.blending.BlendingData;
import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature;
import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.StructureStart;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext;
import net.minecraft.world.ticks.LevelChunkTicks;
#endif
#if POST_MC_1_18_2
import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
#endif
import net.minecraft.world.level.lighting.LevelLightEngine; import net.minecraft.world.level.lighting.LevelLightEngine;
import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.ticks.LevelChunkTicks; import net.minecraft.world.level.material.Fluids;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
public class ChunkLoader public class ChunkLoader
{ {
#if POST_MC_1_18_1
private static final Codec<PalettedContainer<BlockState>> BLOCK_STATE_CODEC = PalettedContainer.codec(Block.BLOCK_STATE_REGISTRY, BlockState.CODEC, PalettedContainer.Strategy.SECTION_STATES, Blocks.AIR.defaultBlockState()); private static final Codec<PalettedContainer<BlockState>> BLOCK_STATE_CODEC = PalettedContainer.codec(Block.BLOCK_STATE_REGISTRY, BlockState.CODEC, PalettedContainer.Strategy.SECTION_STATES, Blocks.AIR.defaultBlockState());
private static final Logger LOGGER = ApiShared.LOGGER; #endif
private static final String TAG_UPGRADE_DATA = "UpgradeData"; private static final String TAG_UPGRADE_DATA = "UpgradeData";
private static final String BLOCK_TICKS_TAG = "block_ticks"; private static final String BLOCK_TICKS_TAG_18 = "block_ticks";
private static final String FLUID_TICKS_TAG = "fluid_ticks"; private static final String FLUID_TICKS_TAG_18 = "fluid_ticks";
private static final String BLOCK_TICKS_TAG_PRE18 = "TileTicks";
private static final String FLUID_TICKS_TAG_PRE18 = "LiquidTicks";
private static final ConfigBasedLogger LOGGER = BatchGenerationEnvironment.LOAD_LOGGER;
#if POST_MC_1_18_1
private static BlendingData readBlendingData(CompoundTag chunkData) private static BlendingData readBlendingData(CompoundTag chunkData)
{ {
BlendingData blendingData = null; BlendingData blendingData = null;
@@ -72,36 +92,51 @@ public class ChunkLoader
} }
return blendingData; return blendingData;
} }
#endif
private static LevelChunkSection[] readSections(LevelAccessor level, LevelLightEngine lightEngine, ChunkPos chunkPos, CompoundTag chunkData) private static LevelChunkSection[] readSections(LevelAccessor level, LevelLightEngine lightEngine, ChunkPos chunkPos, CompoundTag chunkData)
{ {
#if POST_MC_1_18_1
Registry<Biome> biomes = level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); Registry<Biome> biomes = level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY);
#if MC_VERSION_1_18_1 #if PRE_MC_1_18_2
Codec<PalettedContainer<Biome>> biomeCodec = PalettedContainer.codec( Codec<PalettedContainer<Biome>> biomeCodec = PalettedContainer.codec(
biomes, biomes.byNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS)); biomes, biomes.byNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS));
#elif MC_VERSION_1_18_2 #else
Codec<PalettedContainer<Holder<Biome>>> biomeCodec = PalettedContainer.codec( Codec<PalettedContainer<Holder<Biome>>> biomeCodec = PalettedContainer.codec(
biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS)); biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS));
#endif
#endif #endif
int i = #if PRE_MC_1_17_1 16; #else level.getSectionsCount(); #endif
int i = level.getSectionsCount();
LevelChunkSection[] chunkSections = new LevelChunkSection[i]; LevelChunkSection[] chunkSections = new LevelChunkSection[i];
boolean isLightOn = chunkData.getBoolean("isLightOn"); boolean isLightOn = chunkData.getBoolean("isLightOn");
boolean hasSkyLight = level.dimensionType().hasSkyLight(); boolean hasSkyLight = level.dimensionType().hasSkyLight();
ListTag tagSections = chunkData.getList("sections", 10); ListTag tagSections = chunkData.getList("Sections", 10);
if (tagSections.isEmpty()) tagSections = chunkData.getList("sections", 10);
for (int j = 0; j < tagSections.size(); ++j) for (int j = 0; j < tagSections.size(); ++j)
{ {
CompoundTag tagSection = tagSections.getCompound(j); CompoundTag tagSection = tagSections.getCompound(j);
byte sectionYPos = tagSection.getByte("Y"); int sectionYPos = tagSection.getByte("Y");
#if PRE_MC_1_18_1
if (tagSection.contains("Palette", 9) && tagSection.contains("BlockStates", 12)) {
LevelChunkSection levelChunkSection = new LevelChunkSection(sectionYPos << 4);
levelChunkSection.getStates().read(tagSection.getList("Palette", 10),
tagSection.getLongArray("BlockStates"));
levelChunkSection.recalcBlockCounts();
if (!levelChunkSection.isEmpty())
chunkSections[#if PRE_MC_1_17_1 sectionYPos #else level.getSectionIndexFromSectionY(sectionYPos) #endif]
= levelChunkSection;
}
#else
int sectionId = level.getSectionIndexFromSectionY(sectionYPos); int sectionId = level.getSectionIndexFromSectionY(sectionYPos);
if (sectionId >= 0 && sectionId < chunkSections.length) if (sectionId >= 0 && sectionId < chunkSections.length)
{ {
PalettedContainer<BlockState> blockStateContainer; PalettedContainer<BlockState> blockStateContainer;
#if MC_VERSION_1_18_1 #if PRE_MC_1_18_2
PalettedContainer<Biome> biomeContainer; PalettedContainer<Biome> biomeContainer;
#elif MC_VERSION_1_18_2 #else
PalettedContainer<Holder<Biome>> biomeContainer; PalettedContainer<Holder<Biome>> biomeContainer;
#endif #endif
@@ -109,27 +144,26 @@ public class ChunkLoader
? 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)).getOrThrow(false, LOGGER::error)
: 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_VERSION_1_18_1 #if PRE_MC_1_18_2
biomeContainer = tagSection.contains("biomes", 10) biomeContainer = tagSection.contains("biomes", 10)
? 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);
#elif MC_VERSION_1_18_2 #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)).getOrThrow(false, LOGGER::error)
: 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
chunkSections[sectionId] = new LevelChunkSection(sectionYPos, blockStateContainer, biomeContainer); chunkSections[sectionId] = new LevelChunkSection(sectionYPos, blockStateContainer, biomeContainer);
} }
#endif
if (!isLightOn) if (!isLightOn) continue;
continue;
if (tagSection.contains("BlockLight", 7)) if (tagSection.contains("BlockLight", 7))
lightEngine.queueSectionData(LightLayer.BLOCK, SectionPos.of(chunkPos, sectionYPos), new DataLayer(tagSection.getByteArray("BlockLight")), true); lightEngine.queueSectionData(LightLayer.BLOCK, SectionPos.of(chunkPos, sectionYPos),
new DataLayer(tagSection.getByteArray("BlockLight")), true);
if (hasSkyLight && tagSection.contains("SkyLight", 7)) if (hasSkyLight && tagSection.contains("SkyLight", 7))
lightEngine.queueSectionData(LightLayer.SKY, SectionPos.of(chunkPos, sectionYPos), new DataLayer(tagSection.getByteArray("SkyLight")), true); lightEngine.queueSectionData(LightLayer.SKY, SectionPos.of(chunkPos, sectionYPos),
new DataLayer(tagSection.getByteArray("SkyLight")), true);
} }
return chunkSections; return chunkSections;
} }
@@ -146,115 +180,6 @@ public class ChunkLoader
Heightmap.primeHeightmaps(chunk, ChunkStatus.FULL.heightmapsAfter()); Heightmap.primeHeightmaps(chunk, ChunkStatus.FULL.heightmapsAfter());
} }
#if MC_VERSION_1_18_1
private static Map<StructureFeature<?>, StructureStart<?>> unpackStructureStart(StructurePieceSerializationContext structurePieceSerializationContext, CompoundTag compoundTag, long l)
{
HashMap<StructureFeature<?>, StructureStart<?>> map = Maps.newHashMap();
CompoundTag compoundTag2 = compoundTag.getCompound("starts");
for (String string : compoundTag2.getAllKeys())
{
String string2 = string.toLowerCase(Locale.ROOT);
StructureFeature<?> structureFeature = StructureFeature.STRUCTURES_REGISTRY.get(string2);
if (structureFeature == null)
{
LOGGER.error("Unknown structure start: {}", (Object) string2);
continue;
}
StructureStart<?> structureStart = StructureFeature.loadStaticStart(structurePieceSerializationContext, compoundTag2.getCompound(string), l);
if (structureStart == null)
continue;
map.put(structureFeature, structureStart);
}
return map;
}
private static Map<StructureFeature<?>, LongSet> unpackStructureReferences(ChunkPos chunkPos, CompoundTag compoundTag)
{
HashMap<StructureFeature<?>, LongSet> map = Maps.newHashMap();
CompoundTag compoundTag2 = compoundTag.getCompound("References");
for (String string : compoundTag2.getAllKeys())
{
String string2 = string.toLowerCase(Locale.ROOT);
StructureFeature<?> structureFeature = StructureFeature.STRUCTURES_REGISTRY.get(string2);
if (structureFeature == null)
{
LOGGER.warn("Found reference to unknown structure '{}' in chunk {}, discarding", (Object) string2, (Object) chunkPos);
continue;
}
map.put(structureFeature, new LongOpenHashSet(Arrays.stream(compoundTag2.getLongArray(string)).filter(l ->
{
ChunkPos chunkPos2 = new ChunkPos(l);
if (chunkPos2.getChessboardDistance(chunkPos) > 8)
{
LOGGER.warn("Found invalid structure reference [ {} @ {} ] for chunk {}.", (Object) string2, (Object) chunkPos2, (Object) chunkPos);
return false;
}
return true;
}).toArray()));
}
return map;
}
#elif MC_VERSION_1_18_2
private static Map<ConfiguredStructureFeature<?, ?>, StructureStart> unpackStructureStart(StructurePieceSerializationContext structurePieceSerializationContext, CompoundTag compoundTag, long l) {
Map<ConfiguredStructureFeature<?, ?>, StructureStart> map = Maps.newHashMap();
Registry<ConfiguredStructureFeature<?, ?>> structStartRegistry = structurePieceSerializationContext.registryAccess().registryOrThrow(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY);
CompoundTag compoundTag2 = compoundTag.getCompound("starts");
for (String string : compoundTag2.getAllKeys()) {
ResourceLocation resourceLocation = ResourceLocation.tryParse(string);
ConfiguredStructureFeature<?, ?> structureFeature = structStartRegistry.get(resourceLocation);
// String string2 = string.toLowerCase(Locale.ROOT);
// ConfiguredStructureFeature<?, ?> structureFeature = StructureFeature.STRUCTURES_REGISTRY.get(string2);
if (structureFeature == null) {
LOGGER.error("Unknown structure start: {}", resourceLocation);
continue;
}
StructureStart structureStart = StructureFeature.loadStaticStart(structurePieceSerializationContext, compoundTag2.getCompound(string), l);
if (structureStart == null)
continue;
map.put(structureFeature, structureStart);
}
return map;
}
private static Map<ConfiguredStructureFeature<?, ?>, LongSet> unpackStructureReferences(RegistryAccess registryAccess, ChunkPos chunkPos, CompoundTag compoundTag)
{
Map<ConfiguredStructureFeature<?, ?>, LongSet> map = Maps.newHashMap();
Registry<ConfiguredStructureFeature<?, ?>> structRegistry = registryAccess.registryOrThrow(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY);
CompoundTag compoundTag2 = compoundTag.getCompound("References");
for (String string : compoundTag2.getAllKeys())
{
ResourceLocation resourceLocation = ResourceLocation.tryParse(string);
ConfiguredStructureFeature<?, ?> structureFeature = structRegistry.get(resourceLocation);
// String string2 = string.toLowerCase(Locale.ROOT);
// ConfiguredStructureFeature<?, ?> structureFeature = StructureFeature.STRUCTURES_REGISTRY.get(string2);
if (structureFeature == null)
{
LOGGER.warn("Found reference to unknown structure '{}' in chunk {}, discarding", resourceLocation, chunkPos);
continue;
}
map.put(structureFeature, new LongOpenHashSet(Arrays.stream(compoundTag2.getLongArray(string)).filter(l ->
{
ChunkPos chunkPos2 = new ChunkPos(l);
if (chunkPos2.getChessboardDistance(chunkPos) > 8)
{
LOGGER.warn("Found invalid structure reference [ {} @ {} ] for chunk {}.", resourceLocation, chunkPos2, chunkPos);
return false;
}
return true;
}).toArray()));
}
return map;
}
#endif
private static void readStructures(WorldGenLevel level, LevelChunk chunk, CompoundTag chunkData)
{
CompoundTag tagStructures = chunkData.getCompound("structures");
chunk.setAllStarts(
unpackStructureStart(StructurePieceSerializationContext.fromLevel(level.getLevel()), tagStructures, level.getSeed()));
chunk.setAllReferences(unpackStructureReferences(#if MC_VERSION_1_18_2 level.registryAccess() ,#endif chunk.getPos(), tagStructures));
}
private static void readPostPocessings(LevelChunk chunk, CompoundTag chunkData) private static void readPostPocessings(LevelChunk chunk, CompoundTag chunkData)
{ {
ListTag tagPostProcessings = chunkData.getList("PostProcessing", 9); ListTag tagPostProcessings = chunkData.getList("PostProcessing", 9);
@@ -268,49 +193,83 @@ public class ChunkLoader
} }
} }
public static ChunkStatus.ChunkType readChunkType(CompoundTag compoundTag) public static ChunkStatus.ChunkType readChunkType(CompoundTag tagLevel)
{ {
return ChunkStatus.byName(compoundTag.getString("Status")).getChunkType(); ChunkStatus chunkStatus = ChunkStatus.byName(tagLevel.getString("Status"));
if (chunkStatus != null) {
return chunkStatus.getChunkType();
}
return ChunkStatus.ChunkType.PROTOCHUNK;
} }
public static LevelChunk read(WorldGenLevel level, LevelLightEngine lightEngine, ChunkPos chunkPos, CompoundTag chunkData) public static LevelChunk read(WorldGenLevel level, LevelLightEngine lightEngine, ChunkPos chunkPos, CompoundTag chunkData)
{ {
#if PRE_MC_1_18_1
CompoundTag tagLevel = chunkData.getCompound("Level");
#else
CompoundTag tagLevel = chunkData;
#endif
ChunkPos actualPos = new ChunkPos(chunkData.getInt("xPos"), chunkData.getInt("zPos")); ChunkPos actualPos = new ChunkPos(tagLevel.getInt("xPos"), tagLevel.getInt("zPos"));
if (!Objects.equals(chunkPos, actualPos)) if (!Objects.equals(chunkPos, actualPos)) {
{ LOGGER.error("Chunk file at {} is in the wrong location; Ignoring. (Expected {}, got {})", chunkPos, chunkPos, actualPos);
LOGGER.error("Distant Horizons: Chunk file at {} is in the wrong location; Ignoring. (Expected {}, got {})", (Object) chunkPos, (Object) chunkPos, (Object) actualPos);
return null; return null;
} }
ChunkStatus.ChunkType chunkType = readChunkType(chunkData); ChunkStatus.ChunkType chunkType = readChunkType(tagLevel);
BlendingData blendingData = readBlendingData(chunkData); #if PRE_MC_1_18_1
if (chunkType != ChunkStatus.ChunkType.LEVELCHUNK)
return null;
#else
BlendingData blendingData = readBlendingData(tagLevel);
if (chunkType == ChunkStatus.ChunkType.PROTOCHUNK && (blendingData == null || !blendingData.oldNoise())) if (chunkType == ChunkStatus.ChunkType.PROTOCHUNK && (blendingData == null || !blendingData.oldNoise()))
return null; return null;
#endif
// Prepare the light engine long inhabitedTime = tagLevel.getLong("InhabitedTime");
boolean isLightOn = chunkData.getBoolean("isLightOn");
if (isLightOn)
level.getLightEngine().retainData(chunkPos, true);
// Read params for making the LevelChunk //================== Read params for making the LevelChunk ==================
UpgradeData upgradeData = chunkData.contains(TAG_UPGRADE_DATA, 10) UpgradeData upgradeData = tagLevel.contains(TAG_UPGRADE_DATA, 10)
? new UpgradeData(chunkData.getCompound(TAG_UPGRADE_DATA), level) ? new UpgradeData(tagLevel.getCompound(TAG_UPGRADE_DATA)#if POST_MC_1_17_1, level #endif)
: UpgradeData.EMPTY; : UpgradeData.EMPTY;
LevelChunkTicks<Block> blockTicks = LevelChunkTicks.load(chunkData.getList(BLOCK_TICKS_TAG, 10),
boolean isLightOn = tagLevel.getBoolean("isLightOn");
if (isLightOn) lightEngine.retainData(chunkPos, true);
#if PRE_MC_1_18_1
ChunkBiomeContainer chunkBiomeContainer = new ChunkBiomeContainer(
level.getLevel().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY)#if POST_MC_1_17_1, level #endif,
chunkPos, level.getLevel().getChunkSource().getGenerator().getBiomeSource(),
tagLevel.contains("Biomes", 11) ? tagLevel.getIntArray("Biomes") : null);
TickList<Block> blockTicks = tagLevel.contains(BLOCK_TICKS_TAG_PRE18, 9)
? ChunkTickList.create(tagLevel.getList(BLOCK_TICKS_TAG_PRE18, 10), Registry.BLOCK::getKey, Registry.BLOCK::get)
: new ProtoTickList<Block>(block -> (block == null || block.defaultBlockState().isAir()), chunkPos,
tagLevel.getList("ToBeTicked", 9)#if POST_MC_1_17_1, level #endif);
TickList<Fluid> fluidTicks = tagLevel.contains(FLUID_TICKS_TAG_PRE18, 9)
? ChunkTickList.create(tagLevel.getList(FLUID_TICKS_TAG_PRE18, 10), Registry.FLUID::getKey, Registry.FLUID::get)
: new ProtoTickList<Fluid>(fluid -> (fluid == null || fluid == Fluids.EMPTY), chunkPos,
tagLevel.getList("LiquidsToBeTicked", 9)#if POST_MC_1_17_1, level #endif);
#else
LevelChunkTicks<Block> blockTicks = LevelChunkTicks.load(tagLevel.getList(BLOCK_TICKS_TAG_18, 10),
string -> Registry.BLOCK.getOptional(ResourceLocation.tryParse(string)), chunkPos); string -> Registry.BLOCK.getOptional(ResourceLocation.tryParse(string)), chunkPos);
LevelChunkTicks<Fluid> fluidTicks = LevelChunkTicks.load(chunkData.getList(FLUID_TICKS_TAG, 10), LevelChunkTicks<Fluid> fluidTicks = LevelChunkTicks.load(tagLevel.getList(FLUID_TICKS_TAG_18, 10),
string -> Registry.FLUID.getOptional(ResourceLocation.tryParse(string)), chunkPos); string -> Registry.FLUID.getOptional(ResourceLocation.tryParse(string)), chunkPos);
long inhabitedTime = chunkData.getLong("InhabitedTime"); #endif
LevelChunkSection[] chunkSections = readSections(level, lightEngine, actualPos, chunkData);
// Make chunk LevelChunkSection[] levelChunkSections = readSections(level, lightEngine, chunkPos, tagLevel);
LevelChunk chunk = new LevelChunk((Level) level, chunkPos, upgradeData, blockTicks, fluidTicks, inhabitedTime, chunkSections, null, blendingData);
// ====================== Make the chunk =========================
#if PRE_MC_1_18_1
LevelChunk chunk = new LevelChunk((Level) level.getLevel(), chunkPos, chunkBiomeContainer, upgradeData, blockTicks,
fluidTicks, inhabitedTime, levelChunkSections, null);
#else
LevelChunk chunk = new LevelChunk((Level) level, chunkPos, upgradeData, blockTicks,
fluidTicks, inhabitedTime, levelChunkSections, null, blendingData);
#endif
// Set some states after object creation // Set some states after object creation
chunk.setLightCorrect(isLightOn); chunk.setLightCorrect(isLightOn);
readHeightmaps(chunk, chunkData); readHeightmaps(chunk, chunkData);
readStructures(level, chunk, chunkData);
readPostPocessings(chunk, chunkData); readPostPocessings(chunk, chunkData);
return chunk; return chunk;
} }
@@ -1,10 +1,31 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.mimicObject; package com.seibel.lod.common.wrappers.worldGeneration.mimicObject;
import com.seibel.lod.core.handlers.dependencyInjection.ModAccessorHandler; import com.seibel.lod.core.handlers.dependencyInjection.ModAccessorHandler;
import com.seibel.lod.core.wrapperInterfaces.modAccessor.IStarlightAccessor; import com.seibel.lod.core.wrapperInterfaces.modAccessor.IStarlightAccessor;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
#if POST_MC_1_17_1
import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelHeightAccessor;
#endif
import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.world.level.chunk.LightChunkGetter; import net.minecraft.world.level.chunk.LightChunkGetter;
@@ -34,7 +55,10 @@ public class LightGetterAdaptor implements LightChunkGetter {
public BlockGetter getLevel() { public BlockGetter getLevel() {
return shouldReturnNull ? null : (genRegion != null ? genRegion : heightGetter); return shouldReturnNull ? null : (genRegion != null ? genRegion : heightGetter);
} }
#if POST_MC_1_17_1
public LevelHeightAccessor getLevelHeightAccessor() { public LevelHeightAccessor getLevelHeightAccessor() {
return heightGetter; return heightGetter;
} }
#endif
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.mimicObject; package com.seibel.lod.common.wrappers.worldGeneration.mimicObject;
import java.util.List; import java.util.List;
@@ -6,7 +25,6 @@ import com.seibel.lod.core.api.ApiShared;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment.EmptyChunkGenerator; import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment.EmptyChunkGenerator;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.enums.config.LightGenerationMode; import com.seibel.lod.core.enums.config.LightGenerationMode;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
@@ -24,7 +42,9 @@ import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.ColorResolver; import net.minecraft.world.level.ColorResolver;
#if POST_MC_1_17_1
import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelHeightAccessor;
#endif
import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.StructureFeatureManager;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
@@ -49,11 +69,30 @@ public class LightedWorldGenRegion extends WorldGenRegion {
private final ChunkPos firstPos; private final ChunkPos firstPos;
private final List<ChunkAccess> cache; private final List<ChunkAccess> cache;
Long2ObjectOpenHashMap<ChunkAccess> chunkMap = new Long2ObjectOpenHashMap<ChunkAccess>(); Long2ObjectOpenHashMap<ChunkAccess> chunkMap = new Long2ObjectOpenHashMap<ChunkAccess>();
#if PRE_MC_1_18_1
private ChunkPos overrideCenterPos = null;
public void setOverrideCenter(ChunkPos pos) {overrideCenterPos = pos;}
#if PRE_MC_1_17_1
@Override
public int getCenterX() {
return overrideCenterPos==null ? super.getCenterX() : overrideCenterPos.x;
}
@Override
public int getCenterZ() {
return overrideCenterPos==null ? super.getCenterX() : overrideCenterPos.z;
}
#else
@Override
public ChunkPos getCenter() {
return overrideCenterPos==null ? super.getCenter() : overrideCenterPos;
}
#endif
#endif
public LightedWorldGenRegion(ServerLevel serverLevel, WorldGenLevelLightEngine lightEngine, public LightedWorldGenRegion(ServerLevel serverLevel, WorldGenLevelLightEngine lightEngine,
List<ChunkAccess> list, ChunkStatus chunkStatus, int i, List<ChunkAccess> list, ChunkStatus chunkStatus, int i,
LightGenerationMode lightMode, EmptyChunkGenerator generator) { LightGenerationMode lightMode, EmptyChunkGenerator generator) {
super(serverLevel, list, chunkStatus, i); super(serverLevel, list #if POST_MC_1_17_1, chunkStatus, i #endif);
this.lightMode = lightMode; this.lightMode = lightMode;
this.firstPos = list.get(0).getPos(); this.firstPos = list.get(0).getPos();
this.generator = generator; this.generator = generator;
@@ -61,14 +100,9 @@ public class LightedWorldGenRegion extends WorldGenRegion {
writeRadius = i; writeRadius = i;
cache = list; cache = list;
size = Mth.floor(Math.sqrt(list.size())); size = Mth.floor(Math.sqrt(list.size()));
this.tintCaches = Util.make(new Object2ObjectArrayMap(3), object2ObjectArrayMap -> {
object2ObjectArrayMap.put(BiomeColors.GRASS_COLOR_RESOLVER, new BlockTintCache((pos) -> {return calculateBlockTint(pos, BiomeColors.GRASS_COLOR_RESOLVER);}));
object2ObjectArrayMap.put(BiomeColors.FOLIAGE_COLOR_RESOLVER, new BlockTintCache((pos) -> {return calculateBlockTint(pos, BiomeColors.FOLIAGE_COLOR_RESOLVER);}));
object2ObjectArrayMap.put(BiomeColors.WATER_COLOR_RESOLVER, new BlockTintCache((pos) -> {return calculateBlockTint(pos, BiomeColors.WATER_COLOR_RESOLVER);}));
});
} }
#if POST_MC_1_17_1
// Bypass BCLib mixin overrides. // Bypass BCLib mixin overrides.
@Override @Override
public boolean ensureCanWrite(BlockPos blockPos) { public boolean ensureCanWrite(BlockPos blockPos) {
@@ -81,14 +115,17 @@ public class LightedWorldGenRegion extends WorldGenRegion {
if (k > this.writeRadius || l > this.writeRadius) { if (k > this.writeRadius || l > this.writeRadius) {
return false; return false;
} }
#if POST_MC_1_18_1
if (center.isUpgrading()) { if (center.isUpgrading()) {
LevelHeightAccessor levelHeightAccessor = center.getHeightAccessorForGeneration(); LevelHeightAccessor levelHeightAccessor = center.getHeightAccessorForGeneration();
if (blockPos.getY() < levelHeightAccessor.getMinBuildHeight() || blockPos.getY() >= levelHeightAccessor.getMaxBuildHeight()) { if (blockPos.getY() < levelHeightAccessor.getMinBuildHeight() || blockPos.getY() >= levelHeightAccessor.getMaxBuildHeight()) {
return false; return false;
} }
} }
#endif
return true; return true;
} }
#endif
// TODO Check this // TODO Check this
// @Override // @Override
@@ -173,7 +210,7 @@ public class LightedWorldGenRegion extends WorldGenRegion {
public ChunkAccess getChunk(int i, int j, ChunkStatus chunkStatus, boolean bl) { public ChunkAccess getChunk(int i, int j, ChunkStatus chunkStatus, boolean bl) {
ChunkAccess chunk = getChunkAccess(i, j, chunkStatus, bl); ChunkAccess chunk = getChunkAccess(i, j, chunkStatus, bl);
if (chunk instanceof LevelChunk) { if (chunk instanceof LevelChunk) {
chunk = new ImposterProtoChunk((LevelChunk) chunk, true); chunk = new ImposterProtoChunk((LevelChunk) chunk #if POST_MC_1_18_1, true #endif);
} }
return chunk; return chunk;
} }
@@ -238,20 +275,15 @@ public class LightedWorldGenRegion extends WorldGenRegion {
return (getBrightness(LightLayer.SKY, blockPos) >= getMaxLightLevel()); return (getBrightness(LightLayer.SKY, blockPos) >= getMaxLightLevel());
} }
private final Object2ObjectArrayMap<ColorResolver, BlockTintCache> tintCaches;
public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver)
{ {
BlockTintCache blockTintCache = (BlockTintCache) this.tintCaches.get(colorResolver); return calculateBlockTint(blockPos, colorResolver);
return blockTintCache.getColor(blockPos);
} }
private Biome _getBiome(BlockPos pos) { private Biome _getBiome(BlockPos pos) {
#if MC_VERSION_1_18_2 #if POST_MC_1_18_2
return getBiome(pos).value(); return getBiome(pos).value();
#elif MC_VERSION_1_18_1 #else
return getBiome(pos); return getBiome(pos);
#endif #endif
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.mimicObject; package com.seibel.lod.common.wrappers.worldGeneration.mimicObject;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -5,7 +24,9 @@ import org.jetbrains.annotations.Nullable;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.SectionPos; import net.minecraft.core.SectionPos;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.ChunkPos;
#if POST_MC_1_17_1
import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelHeightAccessor;
#endif
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.DataLayer; import net.minecraft.world.level.chunk.DataLayer;
@@ -18,7 +39,9 @@ import net.minecraft.world.level.lighting.SkyLightEngine;
public class WorldGenLevelLightEngine extends LevelLightEngine { public class WorldGenLevelLightEngine extends LevelLightEngine {
public static final int MAX_SOURCE_LEVEL = 15; public static final int MAX_SOURCE_LEVEL = 15;
public static final int LIGHT_SECTION_PADDING = 1; public static final int LIGHT_SECTION_PADDING = 1;
#if POST_MC_1_17_1
protected final LevelHeightAccessor levelHeightAccessor; protected final LevelHeightAccessor levelHeightAccessor;
#endif
@Nullable @Nullable
public final BlockLightEngine blockEngine; public final BlockLightEngine blockEngine;
@Nullable @Nullable
@@ -26,7 +49,9 @@ public class WorldGenLevelLightEngine extends LevelLightEngine {
public WorldGenLevelLightEngine(LightGetterAdaptor genRegion) { public WorldGenLevelLightEngine(LightGetterAdaptor genRegion) {
super(genRegion, false, false); super(genRegion, false, false);
#if POST_MC_1_17_1
this.levelHeightAccessor = genRegion.getLevelHeightAccessor(); this.levelHeightAccessor = genRegion.getLevelHeightAccessor();
#endif
this.blockEngine = new BlockLightEngine(genRegion); this.blockEngine = new BlockLightEngine(genRegion);
this.skyEngine = new SkyLightEngine(genRegion); this.skyEngine = new SkyLightEngine(genRegion);
} }
@@ -123,16 +148,33 @@ public class WorldGenLevelLightEngine extends LevelLightEngine {
chunkAccess.setLightCorrect(false); chunkAccess.setLightCorrect(false);
LevelChunkSection[] levelChunkSections = chunkAccess.getSections(); LevelChunkSection[] levelChunkSections = chunkAccess.getSections();
for (int i = 0; i < chunkAccess.getSectionsCount(); ++i) { for (int i = 0; i <
#if POST_MC_1_17_1
chunkAccess.getSectionsCount()
#else
16
#endif
; ++i) {
LevelChunkSection levelChunkSection = levelChunkSections[i]; LevelChunkSection levelChunkSection = levelChunkSections[i];
#if PRE_MC_1_17_1
if (!LevelChunkSection.isEmpty(levelChunkSection)) {
updateSectionStatus(SectionPos.of(chunkPos, i), false);
}
#elif PRE_MC_1_18_1
if (!LevelChunkSection.isEmpty(levelChunkSection)) {
int j = this.levelHeightAccessor.getSectionYFromSectionIndex(i);
updateSectionStatus(SectionPos.of(chunkPos, j), false);
}
#else
if (levelChunkSection.hasOnlyAir()) continue; if (levelChunkSection.hasOnlyAir()) continue;
int j = this.levelHeightAccessor.getSectionYFromSectionIndex(i); int j = this.levelHeightAccessor.getSectionYFromSectionIndex(i);
updateSectionStatus(SectionPos.of(chunkPos, j), false); updateSectionStatus(SectionPos.of(chunkPos, j), false);
#endif
} }
enableLightSources(chunkPos, true); enableLightSources(chunkPos, true);
if (needLightBlockUpdate) { if (needLightBlockUpdate) {
chunkAccess.getLights().forEach(blockPos -> chunkAccess.getLights().forEach(blockPos ->
onBlockEmissionIncrease(blockPos, chunkAccess.getLightEmission(blockPos))); onBlockEmissionIncrease(blockPos, chunkAccess.getLightEmission(blockPos)));
} }
chunkAccess.setLightCorrect(true); chunkAccess.setLightCorrect(true);
@@ -161,6 +203,8 @@ public class WorldGenLevelLightEngine extends LevelLightEngine {
this.skyEngine.retainData(chunkPos, bl); this.skyEngine.retainData(chunkPos, bl);
} }
} }
#if POST_MC_1_17_1
@Override @Override
public int getLightSectionCount() { public int getLightSectionCount() {
throw new UnsupportedOperationException("This should never be used!"); throw new UnsupportedOperationException("This should never be used!");
@@ -173,4 +217,5 @@ public class WorldGenLevelLightEngine extends LevelLightEngine {
public int getMaxLightSection() { public int getMaxLightSection() {
throw new UnsupportedOperationException("This should never be used!"); throw new UnsupportedOperationException("This should never be used!");
} }
#endif
} }
@@ -1,6 +1,31 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.mimicObject; package com.seibel.lod.common.wrappers.worldGeneration.mimicObject;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@@ -17,66 +42,130 @@ 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.chunk.ChunkStatus;
import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.WorldGenSettings;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature;
#if POST_MC_1_18_1
import net.minecraft.world.level.levelgen.structure.StructureCheck; import net.minecraft.world.level.levelgen.structure.StructureCheck;
#endif
import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.StructureStart;
public class WorldGenStructFeatManager extends StructureFeatureManager { public class WorldGenStructFeatManager extends StructureFeatureManager {
WorldGenLevel genLevel; final WorldGenLevel genLevel;
WorldGenSettings worldGenSettings; WorldGenSettings worldGenSettings;
#if POST_MC_1_18_1
StructureCheck structureCheck; StructureCheck structureCheck;
public WorldGenStructFeatManager(LevelAccessor levelAccessor, WorldGenSettings worldGenSettings, #endif
WorldGenLevel genLevel, StructureCheck structureCheck) { public WorldGenStructFeatManager(WorldGenSettings worldGenSettings,
super(levelAccessor, worldGenSettings, structureCheck); WorldGenLevel genLevel #if POST_MC_1_18_1, StructureCheck structureCheck #endif) {
super(genLevel, worldGenSettings #if POST_MC_1_18_1, structureCheck #endif);
this.genLevel = genLevel; this.genLevel = genLevel;
this.worldGenSettings = worldGenSettings; this.worldGenSettings = worldGenSettings;
} }
public void setGenLevel(WorldGenLevel genLevel) {
this.genLevel = genLevel;
}
@Override @Override
public WorldGenStructFeatManager forWorldGenRegion(WorldGenRegion worldGenRegion) { public WorldGenStructFeatManager forWorldGenRegion(WorldGenRegion worldGenRegion) {
if (worldGenRegion == genLevel) if (worldGenRegion == genLevel)
return this; return this;
return new WorldGenStructFeatManager(worldGenRegion, worldGenSettings, worldGenRegion, structureCheck); return new WorldGenStructFeatManager(worldGenSettings, worldGenRegion #if POST_MC_1_18_1, structureCheck #endif);
} }
private ChunkAccess _getChunk(int x, int z, ChunkStatus status) {
if (genLevel == null) return null;
return genLevel.getChunk(x, z, status, false);
}
#if PRE_MC_1_18_1
@Override @Override
public boolean hasAnyStructureAt(BlockPos blockPos) { public Stream<? extends StructureStart<?>> startsForFeature(SectionPos sectionPos2,
SectionPos sectionPos = SectionPos.of(blockPos); StructureFeature<?> structureFeature) {
ChunkAccess chunk = genLevel.getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES, ChunkAccess chunk = _getChunk(sectionPos2.x(), sectionPos2.z(), ChunkStatus.STRUCTURE_REFERENCES);
false); if (chunk == null) return Stream.empty();
return chunk.getReferencesForFeature(structureFeature).stream().map(pos -> {
SectionPos sectPos = SectionPos.of(ChunkPos.getX(pos), 0, ChunkPos.getZ(pos));
ChunkAccess startChunk = _getChunk(sectPos.x(), sectPos.z(), ChunkStatus.STRUCTURE_STARTS);
if (startChunk == null) return null;
return this.getStartForFeature(sectPos, structureFeature, startChunk);
}).filter(structureStart -> structureStart != null && structureStart.isValid());
}
#else
@Override
public boolean hasAnyStructureAt(BlockPos blockPos) {
SectionPos sectionPos = SectionPos.of(blockPos);
ChunkAccess chunk = _getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES);
if (chunk == null) return false; if (chunk == null) return false;
return chunk.hasAnyStructureReferences(); return chunk.hasAnyStructureReferences();
}
// TODO Check this
/*
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<? extends StructureStart<?>> startsForFeature(SectionPos sectionPos,
StructureFeature<?> structureFeature) {
if (genLevel == null)
return List.of();
ChunkAccess chunk = genLevel.getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES,
false);
if (chunk == null)
return List.of();
LongSet longSet = chunk.getReferencesForFeature(structureFeature);
ImmutableList.Builder builder = ImmutableList.builder();
LongIterator longIterator = longSet.iterator();
while (longIterator.hasNext()) {
long l = (Long)longIterator.next();
SectionPos sectPos = SectionPos.of(new ChunkPos(l), genLevel.getMinSection());
ChunkAccess startChunk = genLevel.getChunk(sectPos.x(), sectPos.z(), ChunkStatus.STRUCTURE_STARTS, false);
if (startChunk == null) continue;
StructureStart<?> structureStart = this.getStartForFeature(sectPos, structureFeature, startChunk);
if (structureStart == null || !structureStart.isValid()) continue;
builder.add(structureStart);
}
return builder.build();
} }
*/ #if MC_1_18_1
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<? extends StructureStart<?>> startsForFeature(SectionPos sectionPos,
StructureFeature<?> structureFeature) {
ChunkAccess chunk = _getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES);
if (chunk == null) return List.of();
// Copied from StructureFeatureManager::startsForFeature(...) with slight tweaks
LongSet longSet = chunk.getReferencesForFeature(structureFeature);
ImmutableList.Builder builder = ImmutableList.builder();
LongIterator longIterator = longSet.iterator();
while (longIterator.hasNext()) {
long l = (Long)longIterator.next();
SectionPos sectPos = SectionPos.of(new ChunkPos(l), genLevel.getMinSection());
ChunkAccess startChunk = _getChunk(sectPos.x(), sectPos.z(), ChunkStatus.STRUCTURE_STARTS);
if (startChunk == null) continue;
StructureStart<?> structureStart = this.getStartForFeature(sectPos, structureFeature, startChunk);
if (structureStart == null || !structureStart.isValid()) continue;
builder.add(structureStart);
}
return builder.build();
}
#else
@Override
public List<StructureStart> startsForFeature(SectionPos sectionPos, Predicate<ConfiguredStructureFeature<?, ?>> predicate) {
ChunkAccess chunk = _getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES);
if (chunk == null) return List.of();
// Copied from StructureFeatureManager::startsForFeature(...)
Map<ConfiguredStructureFeature<?, ?>, LongSet> map = chunk.getAllReferences();
ImmutableList.Builder<StructureStart> builder = ImmutableList.builder();
Iterator<Map.Entry<ConfiguredStructureFeature<?, ?>, LongSet>> var5 = map.entrySet().iterator();
while(var5.hasNext()) {
Map.Entry<ConfiguredStructureFeature<?, ?>, LongSet> entry = var5.next();
ConfiguredStructureFeature<?, ?> configuredStructureFeature = entry.getKey();
if (predicate.test(configuredStructureFeature)) {
LongSet var10002 = (LongSet)entry.getValue();
Objects.requireNonNull(builder);
this.fillStartsForFeature(configuredStructureFeature, var10002, builder::add);
}
}
return builder.build();
}
@Override
public List<StructureStart> startsForFeature(SectionPos sectionPos, ConfiguredStructureFeature<?, ?> configuredStructureFeature) {
ChunkAccess chunk = _getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES);
if (chunk == null) return (List<StructureStart>) Stream.empty();
// Copied from StructureFeatureManager::startsForFeature(...)
LongSet longSet = chunk.getReferencesForFeature(configuredStructureFeature);
ImmutableList.Builder<StructureStart> builder = ImmutableList.builder();
Objects.requireNonNull(builder);
this.fillStartsForFeature(configuredStructureFeature, longSet, builder::add);
return builder.build();
}
@Override
public Map<ConfiguredStructureFeature<?, ?>, LongSet> getAllStructuresAt(BlockPos blockPos) {
SectionPos sectionPos = SectionPos.of(blockPos);
ChunkAccess chunk = _getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES);
if (chunk == null) return (Map<ConfiguredStructureFeature<?, ?>, LongSet>) Stream.empty();
return chunk.getAllReferences();
}
#endif
#endif
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.step; package com.seibel.lod.common.wrappers.worldGeneration.step;
import java.util.ArrayList; import java.util.ArrayList;
@@ -17,7 +36,9 @@ import net.minecraft.world.level.chunk.ProtoChunk;
import net.minecraft.world.level.levelgen.DebugLevelSource; import net.minecraft.world.level.levelgen.DebugLevelSource;
import net.minecraft.world.level.levelgen.FlatLevelSource; import net.minecraft.world.level.levelgen.FlatLevelSource;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
#if POST_MC_1_18_1
import net.minecraft.world.level.levelgen.blending.Blender; import net.minecraft.world.level.levelgen.blending.Blender;
#endif
public final class StepBiomes { public final class StepBiomes {
/** /**
@@ -48,8 +69,12 @@ public final class StepBiomes {
for (ChunkAccess chunk : chunksToDo) { for (ChunkAccess chunk : chunksToDo) {
// System.out.println("StepBiomes: "+chunk.getPos()); // System.out.println("StepBiomes: "+chunk.getPos());
#if PRE_MC_1_18_1
environment.params.generator.createBiomes(environment.params.biomes, chunk);
#else
chunk = environment.joinSync(environment.params.generator.createBiomes(environment.params.biomes, Runnable::run, Blender.of(worldGenRegion), chunk = environment.joinSync(environment.params.generator.createBiomes(environment.params.biomes, Runnable::run, Blender.of(worldGenRegion),
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
#endif
} }
} }
} }
@@ -1,9 +1,29 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.step; package com.seibel.lod.common.wrappers.worldGeneration.step;
import java.util.ArrayList; import java.util.ArrayList;
import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment;
import com.seibel.lod.common.wrappers.worldGeneration.ThreadedParameters; import com.seibel.lod.common.wrappers.worldGeneration.ThreadedParameters;
import com.seibel.lod.common.wrappers.worldGeneration.mimicObject.LightedWorldGenRegion;
import com.seibel.lod.core.util.gridList.ArrayGridList; import com.seibel.lod.core.util.gridList.ArrayGridList;
import net.minecraft.ReportedException; import net.minecraft.ReportedException;
@@ -11,7 +31,10 @@ 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.ChunkStatus;
import net.minecraft.world.level.chunk.ProtoChunk; import net.minecraft.world.level.chunk.ProtoChunk;
import net.minecraft.world.level.levelgen.Heightmap;
#if POST_MC_1_18_1
import net.minecraft.world.level.levelgen.blending.Blender; import net.minecraft.world.level.levelgen.blending.Blender;
#endif
public final class StepFeatures { public final class StepFeatures {
/** /**
@@ -29,7 +52,7 @@ public final class StepFeatures {
public final ChunkStatus STATUS = ChunkStatus.FEATURES; public final ChunkStatus STATUS = ChunkStatus.FEATURES;
public void generateGroup(ThreadedParameters tParams, WorldGenRegion worldGenRegion, public void generateGroup(ThreadedParameters tParams, LightedWorldGenRegion worldGenRegion,
ArrayGridList<ChunkAccess> chunks) { ArrayGridList<ChunkAccess> chunks) {
ArrayList<ChunkAccess> chunksToDo = new ArrayList<ChunkAccess>(); ArrayList<ChunkAccess> chunksToDo = new ArrayList<ChunkAccess>();
@@ -41,20 +64,20 @@ public final class StepFeatures {
for (ChunkAccess chunk : chunksToDo) { for (ChunkAccess chunk : chunksToDo) {
try { try {
#if PRE_MC_1_18_1
worldGenRegion.setOverrideCenter(chunk.getPos());
Heightmap.primeHeightmaps(chunk, STATUS.heightmapsAfter());
environment.params.generator.applyBiomeDecoration(worldGenRegion, tParams.structFeat);
#else
Heightmap.primeHeightmaps(chunk, STATUS.heightmapsAfter());
environment.params.generator.applyBiomeDecoration(worldGenRegion, chunk, environment.params.generator.applyBiomeDecoration(worldGenRegion, chunk,
tParams.structFeat.forWorldGenRegion(worldGenRegion)); tParams.structFeat.forWorldGenRegion(worldGenRegion));
Blender.generateBorderTicks(worldGenRegion, chunk); #endif
} catch (ReportedException e) { } catch (ReportedException e) {
e.printStackTrace(); e.printStackTrace();
// FIXME: Features concurrent modification issue. Something about cocobeans just // FIXME: Features concurrent modification issue. Something about cocobeans might just
// aren't happy // error out. For now just retry.
// For now just retry.
} }
}/* }
for (ChunkAccess chunk : chunks) {
Heightmap.primeHeightmaps(chunk,
EnumSet.of(Heightmap.Types.MOTION_BLOCKING, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES,
Heightmap.Types.OCEAN_FLOOR, Heightmap.Types.WORLD_SURFACE));
}*/
} }
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.step; package com.seibel.lod.common.wrappers.worldGeneration.step;
import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment;
@@ -9,6 +28,7 @@ import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ChunkStatus; 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.lighting.LevelLightEngine;
import net.minecraft.world.level.lighting.LightEventListener; import net.minecraft.world.level.lighting.LightEventListener;
public final class StepLight { public final class StepLight {
@@ -27,9 +47,10 @@ public final class StepLight {
public final ChunkStatus STATUS = ChunkStatus.LIGHT; public final ChunkStatus STATUS = ChunkStatus.LIGHT;
public void generateGroup(LightEventListener lightEngine, public void generateGroup(
#if PRE_MC_1_17_1 LevelLightEngine lightEngine,
#else LightEventListener lightEngine, #endif
ArrayGridList<ChunkAccess> chunks) { ArrayGridList<ChunkAccess> chunks) {
//ArrayList<ChunkAccess> chunksToDo = new ArrayList<ChunkAccess>();
for (ChunkAccess chunk : chunks) { for (ChunkAccess chunk : chunks) {
if (chunk.getStatus().isOrAfter(STATUS)) continue; if (chunk.getStatus().isOrAfter(STATUS)) continue;
@@ -52,7 +73,9 @@ public final class StepLight {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
#if POST_MC_1_18_1
if (chunk instanceof LevelChunk) ((LevelChunk)chunk).setClientLightReady(true); if (chunk instanceof LevelChunk) ((LevelChunk)chunk).setClientLightReady(true);
#endif
chunk.setLightCorrect(true); chunk.setLightCorrect(true);
} }
lightEngine.runUpdates(Integer.MAX_VALUE, true, true); lightEngine.runUpdates(Integer.MAX_VALUE, true, true);
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.step; package com.seibel.lod.common.wrappers.worldGeneration.step;
import java.util.ArrayList; import java.util.ArrayList;
@@ -9,9 +28,12 @@ import com.google.common.collect.Sets;
import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment;
import com.seibel.lod.common.wrappers.worldGeneration.ThreadedParameters; import com.seibel.lod.common.wrappers.worldGeneration.ThreadedParameters;
import com.seibel.lod.core.util.LodUtil;
import net.minecraft.server.level.WorldGenRegion; import net.minecraft.server.level.WorldGenRegion;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
#if POST_MC_1_17_1
import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelHeightAccessor;
#endif
import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.StructureFeatureManager;
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.ChunkStatus;
@@ -19,7 +41,9 @@ import net.minecraft.world.level.chunk.LevelChunkSection;
import net.minecraft.world.level.chunk.ProtoChunk; import net.minecraft.world.level.chunk.ProtoChunk;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import net.minecraft.world.level.levelgen.NoiseSettings; import net.minecraft.world.level.levelgen.NoiseSettings;
#if POST_MC_1_18_1
import net.minecraft.world.level.levelgen.blending.Blender; import net.minecraft.world.level.levelgen.blending.Blender;
#endif
public final class StepNoise { public final class StepNoise {
/** /**
@@ -50,8 +74,16 @@ public final class StepNoise {
for (ChunkAccess chunk : chunksToDo) { for (ChunkAccess chunk : chunksToDo) {
// System.out.println("StepNoise: "+chunk.getPos()); // System.out.println("StepNoise: "+chunk.getPos());
#if PRE_MC_1_17_1
environment.params.generator.fillFromNoise(worldGenRegion, tParams.structFeat, chunk);
#elif PRE_MC_1_18_1
chunk = environment.joinSync(environment.params.generator.fillFromNoise(Runnable::run,
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
#else
chunk = environment.joinSync(environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion), chunk = environment.joinSync(environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion),
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
#endif
LodUtil.checkInterruptsUnchecked(); // Speed up termination responsiveness
} }
} }
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.step; package com.seibel.lod.common.wrappers.worldGeneration.step;
import java.util.ArrayList; import java.util.ArrayList;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.step; package com.seibel.lod.common.wrappers.worldGeneration.step;
import java.util.ArrayList; import java.util.ArrayList;
@@ -53,6 +72,8 @@ public final class StepStructureStart {
// System.out.println("StepStructureStart: "+chunk.getPos()); // System.out.println("StepStructureStart: "+chunk.getPos());
environment.params.generator.createStructures(environment.params.registry, tParams.structFeat, chunk, environment.params.structures, environment.params.generator.createStructures(environment.params.registry, tParams.structFeat, chunk, environment.params.structures,
environment.params.worldSeed); environment.params.worldSeed);
#if POST_MC_1_18_1
try { try {
tParams.structCheck.onStructureLoad(chunk.getPos(), chunk.getAllStarts()); tParams.structCheck.onStructureLoad(chunk.getPos(), chunk.getAllStarts());
} catch (ArrayIndexOutOfBoundsException e) { } catch (ArrayIndexOutOfBoundsException e) {
@@ -61,6 +82,7 @@ public final class StepStructureStart {
// TODO: Figure out in the future why this happens even though I am using new structFeat // TODO: Figure out in the future why this happens even though I am using new structFeat
throw new StepStructureStart.StructStartCorruptedException(e); throw new StepStructureStart.StructStartCorruptedException(e);
} }
#endif
} }
} }
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.common.wrappers.worldGeneration.step; package com.seibel.lod.common.wrappers.worldGeneration.step;
import java.util.ArrayList; import java.util.ArrayList;
@@ -39,8 +58,12 @@ public final class StepSurface {
for (ChunkAccess chunk : chunksToDo) { for (ChunkAccess chunk : chunksToDo) {
// System.out.println("StepSurface: "+chunk.getPos()); // System.out.println("StepSurface: "+chunk.getPos());
environment.params.generator.buildSurface(worldGenRegion, tParams.structFeat.forWorldGenRegion(worldGenRegion), #if PRE_MC_1_18_1
chunk); environment.params.generator.buildSurfaceAndBedrock(worldGenRegion, chunk);
#else
environment.params.generator.buildSurface(worldGenRegion, tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk);
#endif
} }
} }
} }
@@ -0,0 +1,45 @@
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 field com/mojang/blaze3d/vertex/VertexBuffer vertexCount I
accessible field com/mojang/blaze3d/vertex/VertexBuffer id I
accessible method net/minecraft/client/renderer/GameRenderer getFov (Lnet/minecraft/client/Camera;FZ)D
# pre-render setup
accessible field net/minecraft/client/renderer/LevelRenderer renderChunks Lit/unimi/dsi/fastutil/objects/ObjectList;
accessible class net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo
accessible field net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo chunk Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk;
# used for grabbing vanilla rendered chunks
accessible class net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo
accessible field net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo chunk Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk;
#accessible field net/minecraft/world/entity/Entity blockPosition Lnet/minecraft/core/BlockPos;
# lighting
accessible field net/minecraft/client/renderer/LightTexture lightPixels Lcom/mojang/blaze3d/platform/NativeImage;
accessible field net/minecraft/client/renderer/LightTexture lightTexture Lnet/minecraft/client/renderer/texture/DynamicTexture;
accessible field net/minecraft/world/level/lighting/LevelLightEngine blockEngine Lnet/minecraft/world/level/lighting/LayerLightEngine;
accessible field net/minecraft/world/level/lighting/LevelLightEngine skyEngine Lnet/minecraft/world/level/lighting/LayerLightEngine;
# world generation
accessible method net/minecraft/world/level/levelgen/Heightmap setHeight (III)V
accessible field net/minecraft/world/level/biome/Biome generationSettings Lnet/minecraft/world/level/biome/BiomeGenerationSettings;
accessible field net/minecraft/world/level/biome/Biome biomeCategory Lnet/minecraft/world/level/biome/Biome$BiomeCategory;
#accessible field net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator settings Lnet/minecraft/core/Holder;
#accessible method net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator doCreateBiomes (Lnet/minecraft/core/Registry;Lnet/minecraft/world/level/levelgen/blending/Blender;Lnet/minecraft/world/level/StructureFeatureManager;Lnet/minecraft/world/level/chunk/ChunkAccess;)V
accessible method net/minecraft/world/level/lighting/LayerLightEngine queueSectionData (JLnet/minecraft/world/level/chunk/DataLayer;Z)V
# lod generation from save file
accessible field net/minecraft/server/level/ChunkMap mainThreadExecutor Lnet/minecraft/util/thread/BlockableEventLoop;
accessible method net/minecraft/server/level/ChunkMap readChunk (Lnet/minecraft/world/level/ChunkPos;)Lnet/minecraft/nbt/CompoundTag;
# grabbing textures
accessible field net/minecraft/client/renderer/block/model/BakedQuad sprite Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite framesX [I
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite framesY [I
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite mainImage [Lcom/mojang/blaze3d/platform/NativeImage;
extendable class com/mojang/math/Matrix4f
@@ -0,0 +1,48 @@
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 field com/mojang/blaze3d/vertex/VertexBuffer indexCount I
accessible field com/mojang/blaze3d/vertex/VertexBuffer vertextBufferId I
accessible method net/minecraft/client/renderer/GameRenderer getFov (Lnet/minecraft/client/Camera;FZ)D
# pre-render setup
accessible field net/minecraft/client/renderer/LevelRenderer renderChunks Lit/unimi/dsi/fastutil/objects/ObjectArrayList;
accessible class net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo
accessible field net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo chunk Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk;
# used for grabbing vanilla rendered chunks
accessible class net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo
accessible field net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo chunk Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk;
# lighting
accessible field net/minecraft/client/renderer/LightTexture lightPixels Lcom/mojang/blaze3d/platform/NativeImage;
accessible field net/minecraft/client/renderer/LightTexture lightTexture Lnet/minecraft/client/renderer/texture/DynamicTexture;
accessible field net/minecraft/world/level/lighting/LevelLightEngine blockEngine Lnet/minecraft/world/level/lighting/LayerLightEngine;
accessible field net/minecraft/world/level/lighting/LevelLightEngine skyEngine Lnet/minecraft/world/level/lighting/LayerLightEngine;
# world generation
accessible method net/minecraft/world/level/levelgen/Heightmap setHeight (III)V
accessible field net/minecraft/world/level/biome/Biome generationSettings Lnet/minecraft/world/level/biome/BiomeGenerationSettings;
accessible field net/minecraft/world/level/biome/Biome biomeCategory Lnet/minecraft/world/level/biome/Biome$BiomeCategory;
# accessible field net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator settings Lnet/minecraft/core/Holder;
#accessible method net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator doCreateBiomes (Lnet/minecraft/core/Registry;Lnet/minecraft/world/level/levelgen/blending/Blender;Lnet/minecraft/world/level/StructureFeatureManager;Lnet/minecraft/world/level/chunk/ChunkAccess;)V
accessible method net/minecraft/world/level/lighting/LayerLightEngine queueSectionData (JLnet/minecraft/world/level/chunk/DataLayer;Z)V
# lod generation from save file
accessible field net/minecraft/server/level/ChunkMap mainThreadExecutor Lnet/minecraft/util/thread/BlockableEventLoop;
accessible method net/minecraft/server/level/ChunkMap readChunk (Lnet/minecraft/world/level/ChunkPos;)Lnet/minecraft/nbt/CompoundTag;
# grabbing textures
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite animatedTexture Lnet/minecraft/client/renderer/texture/TextureAtlasSprite$AnimatedTexture;
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite width I
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite height I
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite mainImage [Lcom/mojang/blaze3d/platform/NativeImage;
accessible class net/minecraft/client/renderer/texture/TextureAtlasSprite$AnimatedTexture
accessible method net/minecraft/client/renderer/texture/TextureAtlasSprite$AnimatedTexture getFrameX (I)I
accessible method net/minecraft/client/renderer/texture/TextureAtlasSprite$AnimatedTexture getFrameY (I)I
extendable class com/mojang/math/Matrix4f
@@ -1,5 +1,6 @@
accessWidener v1 named accessWidener v1 named
# used when determining where to save files to # used when determining where to save files to
accessible field net/minecraft/world/level/storage/DimensionDataStorage dataFolder Ljava/io/File; accessible field net/minecraft/world/level/storage/DimensionDataStorage dataFolder Ljava/io/File;
@@ -16,6 +17,7 @@ accessible field net/minecraft/client/renderer/LevelRenderer$RenderChunkInfo chu
# lighting # lighting
accessible field net/minecraft/client/renderer/LightTexture lightPixels Lcom/mojang/blaze3d/platform/NativeImage; accessible field net/minecraft/client/renderer/LightTexture lightPixels Lcom/mojang/blaze3d/platform/NativeImage;
accessible field net/minecraft/client/renderer/LightTexture lightTexture Lnet/minecraft/client/renderer/texture/DynamicTexture;
accessible field net/minecraft/world/level/lighting/LevelLightEngine blockEngine Lnet/minecraft/world/level/lighting/LayerLightEngine; accessible field net/minecraft/world/level/lighting/LevelLightEngine blockEngine Lnet/minecraft/world/level/lighting/LayerLightEngine;
accessible field net/minecraft/world/level/lighting/LevelLightEngine skyEngine Lnet/minecraft/world/level/lighting/LayerLightEngine; accessible field net/minecraft/world/level/lighting/LevelLightEngine skyEngine Lnet/minecraft/world/level/lighting/LayerLightEngine;
@@ -0,0 +1,3 @@
{
"accessWidener": "lod.accesswidener"
}
+1 -1
Submodule core updated: 6cd0281d0e...83a2fa86d9
+15
View File
@@ -0,0 +1,15 @@
architectury {
common(rootProject.enabled_platforms.split(","))
}
dependencies {
// Use Fabric loader as both Quilt and Fabric can use it
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
// Fabric API
fabricApi.module("fabric-lifecycle-events-v1", rootProject.fabric_api_version)
fabricApi.module("fabric-key-binding-api-v1", rootProject.fabric_api_version)
fabricApi.module("fabric-networking-api-v1", rootProject.fabric_api_version)
compileClasspath(project(path: ":common", configuration: "namedElements")) { transitive false }
}
@@ -0,0 +1,55 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric_like.mixins;
import org.spongepowered.asm.mixin.Mixin;
import net.minecraft.world.level.chunk.ChunkGenerator;
#if PRE_MC_1_18_1
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.WorldGenRegion;
import net.minecraft.world.level.StructureFeatureManager;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.WorldgenRandom;
@Mixin(ChunkGenerator.class)
public class MixinChunkGenerator {
@Redirect(method = "applyBiomeDecoration", at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/level/biome/Biome;generate(Lnet/minecraft/world/level/StructureFeatureManager;"
+ "Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/server/level/WorldGenRegion;J"
+ "Lnet/minecraft/world/level/levelgen/WorldgenRandom;Lnet/minecraft/core/BlockPos;)V"
))
private void wrapBiomeGenerateCall(Biome biome, StructureFeatureManager structFeatManager, ChunkGenerator generator,
WorldGenRegion genRegion, long l, WorldgenRandom random, BlockPos pos) {
synchronized(ChunkGenerator.class) {
biome.generate(structFeatManager, (ChunkGenerator)(Object)this, genRegion, l, random, pos);
}
}
}
#else
@Mixin(ChunkGenerator.class)
public class MixinChunkGenerator {}
#endif
@@ -0,0 +1,77 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric_like.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.mojang.blaze3d.systems.RenderSystem;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton;
import net.minecraft.client.Camera;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
#if PRE_MC_1_17_1
import net.minecraft.world.level.material.FluidState;
#else
import net.minecraft.world.level.material.FogType;
#endif
@Mixin(FogRenderer.class)
public class MixinFogRenderer {
private static ILodConfigWrapperSingleton CONFIG;
// Using this instead of Float.MAX_VALUE because Sodium don't like it.
private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F;
private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F;
@Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZ)V")
private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) {
if (CONFIG == null) CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
#if PRE_MC_1_17_1
FluidState fluidState = camera.getFluidInCamera();
boolean cameraNotInFluid = fluidState.isEmpty();
#else
FogType fogTypes = camera.getFluidInCamera();
boolean cameraNotInFluid = fogTypes == FogType.NONE;
#endif
Entity entity = camera.getEntity();
boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS);
if (!isSpecialFog && cameraNotInFluid && fogMode == FogMode.FOG_TERRAIN
&& CONFIG.client().graphics().fogQuality().getDisableVanillaFog())
{
#if PRE_MC_1_17_1
RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE);
RenderSystem.fogEnd(A_EVEN_LARGER_VALUE);
#else
RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE);
RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE);
#endif
}
}
}
@@ -1,4 +1,23 @@
package com.seibel.lod.fabric.mixins; /*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric_like.mixins;
import com.seibel.lod.common.wrappers.config.ConfigGui; import com.seibel.lod.common.wrappers.config.ConfigGui;
import com.seibel.lod.common.wrappers.config.TexturedButtonWidget; import com.seibel.lod.common.wrappers.config.TexturedButtonWidget;
@@ -34,7 +53,8 @@ public class MixinOptionsScreen extends Screen {
@Inject(at = @At("HEAD"),method = "init") @Inject(at = @At("HEAD"),method = "init")
private void lodconfig$init(CallbackInfo ci) { private void lodconfig$init(CallbackInfo ci) {
if (SingletonHandler.get(ILodConfigWrapperSingleton.class).client().getOptionsButton()) if (SingletonHandler.get(ILodConfigWrapperSingleton.class).client().getOptionsButton())
this.addRenderableWidget(new TexturedButtonWidget( this. #if PRE_MC_1_17_1 addButton #else addRenderableWidget #endif
(new TexturedButtonWidget(
// Where the button is on the screen // Where the button is on the screen
this.width / 2 - 180, this.height / 6 - 12, this.width / 2 - 180, this.height / 6 - 12,
// Width and height of the button // Width and height of the button
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -17,16 +17,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.seibel.lod.fabric.mixins; package com.seibel.lod.fabric_like.mixins;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Matrix4f; import com.mojang.math.Matrix4f;
import com.seibel.lod.common.Config;
import com.seibel.lod.common.wrappers.McObjectConverter; import com.seibel.lod.common.wrappers.McObjectConverter;
import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.objects.math.Mat4f; import com.seibel.lod.core.objects.math.Mat4f;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import org.lwjgl.opengl.GL15;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
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;
@@ -54,6 +56,40 @@ public class MixinWorldRenderer
throw new NullPointerException("Null cannot be cast to non-null type."); throw new NullPointerException("Null cannot be cast to non-null type.");
} }
// Inject rendering at first call to renderChunkLayer
// HEAD or RETURN
#if PRE_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)
{
// get the partial ticks since renderBlockLayer doesn't
// have access to them
previousPartialTicks = partialTicks;
}
@Inject(at = @At("HEAD"),
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V",
cancellable = true)
private void renderChunkLayer(RenderType renderType, PoseStack matrixStackIn, double xIn, double yIn, double zIn, CallbackInfo callback)
{
// only render before solid blocks
if (renderType.equals(RenderType.solid()))
{
// get MC's current projection matrix
float[] mcProjMatrixRaw = new float[16];
GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw);
Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw);
mcProjectionMatrix.transpose();
Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose());
ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks);
}
if (Config.Client.Advanced.lodOnlyMode) {
callback.cancel();
}
}
#else
@Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true) @Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true)
public void renderClouds(PoseStack poseStack, Matrix4f projectionMatrix, float tickDelta, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { public void renderClouds(PoseStack poseStack, Matrix4f projectionMatrix, float tickDelta, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) {
// get the partial ticks since renderChunkLayer doesn't // get the partial ticks since renderChunkLayer doesn't
@@ -61,23 +97,6 @@ public class MixinWorldRenderer
previousPartialTicks = tickDelta; previousPartialTicks = tickDelta;
} }
// HEAD or RETURN
@Inject(at = @At("RETURN"),
method = "renderSky",
cancellable = true)
private void renderLod(PoseStack modelViewMatrixStack, Matrix4f projectionMatrix, float f,
#if MC_VERSION_1_18_2 Camera camera, boolean bl,#endif Runnable r, CallbackInfo callback) {
Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks);
}
/*
// HEAD or RETURN
@Inject(at = @At("HEAD"), @Inject(at = @At("HEAD"),
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLcom/mojang/math/Matrix4f;)V", method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLcom/mojang/math/Matrix4f;)V",
cancellable = true) cancellable = true)
@@ -91,6 +110,9 @@ public class MixinWorldRenderer
ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks);
} }
//callback.cancel(); if (Config.Client.Advanced.lodOnlyMode) {
}*/ callback.cancel();
}
}
#endif
} }
@@ -0,0 +1,28 @@
package com.seibel.lod.fabric_like.mixins.events;
import com.mojang.blaze3d.platform.NativeImage;
import com.seibel.lod.common.wrappers.minecraft.MinecraftRenderWrapper;
import com.seibel.lod.core.api.ApiShared;
import net.minecraft.client.renderer.LightTexture;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
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;
@Mixin(LightTexture.class)
public class MixinLightmap {
@Shadow
@Final
public NativeImage lightPixels;
@Inject(method="updateLightTexture", at=@At(
value="INVOKE",
target="Lnet/minecraft/client/renderer/texture/DynamicTexture;upload()V"))
public void updateLightTexture(float f, CallbackInfo ci) {
//ApiShared.LOGGER.info("Lightmap update");
MinecraftRenderWrapper.INSTANCE.updateLightmap(lightPixels);
}
}
@@ -0,0 +1,53 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric_like.mixins.unsafe;
import net.minecraft.server.level.ServerLevel;
import org.spongepowered.asm.mixin.Mixin;
#if POST_MC_1_18_1
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)
*/
@Mixin(ThreadingDetector.class)
public class MixinThreadingDectector {
@Mutable
@Shadow
private Semaphore lock;
@Inject(method = "<init>", at = @At("RETURN"))
private void setSemaphore(CallbackInfo ci) {
this.lock = new Semaphore(2);
}
}
#else
@Mixin(ServerLevel.class)
public class MixinThreadingDectector {} //FIXME: Is there some way to make this file just not be added?
#endif
@@ -0,0 +1,18 @@
{
"required": true,
"minVersion": "0.8",
"package": "com.seibel.lod.fabric_like.mixins",
"mixins": [
"unsafe.MixinThreadingDectector"
],
"client": [
"MixinOptionsScreen",
"MixinWorldRenderer",
"MixinFogRenderer",
"MixinChunkGenerator",
"events.MixinLightmap"
],
"injectors": {
"defaultRequire": 1
}
}
+19 -31
View File
@@ -1,13 +1,9 @@
plugins { plugins {
id "com.github.johnrengelman.shadow" version "7.1.0" id "com.github.johnrengelman.shadow" version "7.1.2"
} }
version = rootProject.mod_version+"-"+rootProject.minecraft_version+"-"+new Date().format("yyyy_MM_dd_HH_mm") version = rootProject.mod_version+"-"+rootProject.minecraft_version+"-"+new Date().format("yyyy_MM_dd_HH_mm")
loom {
accessWidenerPath.set(project(":common").file("src/main/resources/lod.accesswidener"))
}
architectury { architectury {
platformSetupLoomIde() platformSetupLoomIde()
fabric() fabric()
@@ -17,11 +13,10 @@ configurations {
compileClasspath.extendsFrom common compileClasspath.extendsFrom common
runtimeClasspath.extendsFrom common runtimeClasspath.extendsFrom common
developmentFabric.extendsFrom common developmentFabric.extendsFrom common
}
repositories { addModJar
// Required for ModMenu include.extendsFrom addModJar
maven { url "https://maven.terraformersmc.com/" } modImplementation.extendsFrom addModJar
} }
def addMod(path, enabled) { def addMod(path, enabled) {
@@ -36,19 +31,24 @@ dependencies {
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
// Fabric API // Fabric API
modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" addModJar(fabricApi.module("fabric-lifecycle-events-v1", rootProject.fabric_api_version))
addModJar(fabricApi.module("fabric-key-binding-api-v1", rootProject.fabric_api_version))
addModJar(fabricApi.module("fabric-networking-api-v1", rootProject.fabric_api_version))
// Mod Menu // Mod Menu
modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}") { modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}")
exclude(group: "net.fabricmc.fabric-api")
}
// 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)
// Phosphor
addMod("curse.maven:phosphor-372124:${rootProject.phosphor_version_fabric}", rootProject.enable_phosphor)
// Sodium // Sodium
addMod("curse.maven:sodium-394468:${rootProject.sodium_version}", rootProject.enable_sodium) addMod("curse.maven:sodium-394468:${rootProject.sodium_version}", rootProject.enable_sodium)
implementation "org.joml:joml:1.10.2" implementation "org.joml:joml:1.10.2"
modImplementation(fabricApi.module("fabric-rendering-data-attachment-v1", rootProject.fabric_api_version))
modImplementation(fabricApi.module("fabric-rendering-fluids-v1", rootProject.fabric_api_version))
// Lithium // Lithium
addMod("maven.modrinth:lithium:${rootProject.lithium_version}", rootProject.enable_lithium) addMod("maven.modrinth:lithium:${rootProject.lithium_version}", rootProject.enable_lithium)
@@ -90,38 +90,26 @@ dependencies {
shadowMe 'org.apache.commons:commons-compress:1.21' shadowMe 'org.apache.commons:commons-compress:1.21'
} }
// This method copies the access wideners from the common project to the fabric project. And it was generated by Github Copilot
task copyAccessWidener(type: Copy) {
from project(":common").file("src/main/resources/lod.accesswidener")
into file("src/generated/resources")
}
task copyCoreResources(type: Copy) {
from fileTree(project(":core").file("src/main/resources"))
into file("build/resources/main")
}
task deleteResources(type: Delete) { task deleteResources(type: Delete) {
delete file("build/resources/main") delete file("build/resources/main")
} }
task copyCommonResources(type: Copy) { processResources {
from fileTree(project(":common").file("src/main/resources")) dependsOn(copyCoreResources)
into file("build/resources/main") dependsOn(copyCommonResources)
dependsOn(copyAccessWidener)
} }
runClient { runClient {
dependsOn(copyCoreResources) dependsOn(copyCoreResources)
dependsOn(copyCommonResources) dependsOn(copyCommonResources)
dependsOn(copyAccessWidener)
jvmArgs "-XX:-OmitStackTraceInFastThrow" jvmArgs "-XX:-OmitStackTraceInFastThrow"
finalizedBy(deleteResources) finalizedBy(deleteResources)
} }
processResources {
dependsOn(copyAccessWidener)
}
shadowJar { shadowJar {
exclude "architectury.common.json"
configurations = [project.configurations.shadowMe] configurations = [project.configurations.shadowMe]
relocate 'org.tukaani', 'shaded.tukaani' relocate 'org.tukaani', 'shaded.tukaani'
relocate 'org.apache.commons.compress', 'shaded.apache.commons.compress' relocate 'org.apache.commons.compress', 'shaded.apache.commons.compress'
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -31,12 +31,14 @@ import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton;
import com.seibel.lod.fabric.mixins.MixinUtilBackgroudThread; import com.seibel.lod.fabric.mixins.MixinUtilBackgroudThread;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@@ -77,7 +79,9 @@ public class ClientProxy
/* World Events */ /* World Events */
//ServerChunkEvents.CHUNK_LOAD.register(this::chunkLoadEvent); //ServerChunkEvents.CHUNK_LOAD.register(this::chunkLoadEvent);
//ClientChunkEvents.CHUNK_LOAD.register(this::chunkLoadEvent); #if PRE_MC_1_18_1 // in 1.18+, we use mixin hook in setClientLightReady(true)
ClientChunkEvents.CHUNK_LOAD.register(this::chunkLoadEvent);
#endif
/* World Events */ /* World Events */
ServerWorldEvents.LOAD.register((server, level) -> this.worldLoadEvent(level)); ServerWorldEvents.LOAD.register((server, level) -> this.worldLoadEvent(level));
@@ -116,6 +120,7 @@ public class ClientProxy
/** This is also called when a new dimension loads */ /** This is also called when a new dimension loads */
public void worldLoadEvent(Level level) public void worldLoadEvent(Level level)
{ {
if (Minecraft.getInstance().screen instanceof TitleScreen) return;
if (level != null) { if (level != null) {
eventApi.worldLoadEvent(WorldWrapper.getWorldWrapper(level)); eventApi.worldLoadEvent(WorldWrapper.getWorldWrapper(level));
} }
@@ -156,7 +161,7 @@ public class ClientProxy
eventApi.blockChangeEvent(chunk, dimType); eventApi.blockChangeEvent(chunk, dimType);
} }
private static final List<Integer> KEY_TO_CHECK_FOR = List.of(GLFW.GLFW_KEY_F6, GLFW.GLFW_KEY_F8); private static final int[] KEY_TO_CHECK_FOR = {GLFW.GLFW_KEY_F6, GLFW.GLFW_KEY_F8};
HashSet<Integer> previousKeyDown = new HashSet<Integer>(); HashSet<Integer> previousKeyDown = new HashSet<Integer>();
@@ -169,7 +174,7 @@ public class ClientProxy
// Note: Minecraft's InputConstants is same as GLFW Key values // Note: Minecraft's InputConstants is same as GLFW Key values
//TODO: Use mixin to hook directly into the GLFW Keyboard event in minecraft KeyboardHandler //TODO: Use mixin to hook directly into the GLFW Keyboard event in minecraft KeyboardHandler
// Check all keys we need // Check all keys we need
for (int i = InputConstants.KEY_A; i <= InputConstants.KEY_Z; i++) { for (int i = GLFW.GLFW_KEY_A; i <= GLFW.GLFW_KEY_Z; i++) {
if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), i)) { if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), i)) {
currectKeyDown.add(i); currectKeyDown.add(i);
} }
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -47,23 +47,17 @@ import net.fabricmc.api.ClientModInitializer;
* @author Ran * @author Ran
* @version 12-1-2021 * @version 12-1-2021
*/ */
public class Main implements ClientModInitializer public class Main
{ {
// This is a client mod so it should implement ClientModInitializer and in fabric.mod.json it should have "environment": "client" // This is a client mod so it should implement ClientModInitializer and in fabric.mod.json it should have "environment": "client"
// Once it works on servers change the implement to ModInitializer and in fabric.mod.json it should be "environment": "*" // Once it works on servers change the implement to ModInitializer and in fabric.mod.json it should be "environment": "*"
public static ClientProxy client_proxy; public static ClientProxy client_proxy;
public static boolean isQuilt;
// Do if implements ClientModInitializer
// This loads the mod before minecraft loads which causes a lot of issues
@Override
public void onInitializeClient() {
// no.
}
// This loads the mod after minecraft loads which doesn't causes a lot of issues // This loads the mod after minecraft loads which doesn't causes a lot of issues
public static void init() { public static void init() {
scuffedQuiltChecker();
LodCommonMain.initConfig(); LodCommonMain.initConfig();
LodCommonMain.startup(null, false, new NetworkHandler()); LodCommonMain.startup(null, false, new NetworkHandler());
FabricDependencySetup.createInitialBindings(); FabricDependencySetup.createInitialBindings();
@@ -93,4 +87,13 @@ public class Main implements ClientModInitializer
FabricDependencySetup.finishBinding(); FabricDependencySetup.finishBinding();
ApiShared.LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); ApiShared.LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION);
} }
public static void scuffedQuiltChecker() {
try {
Class.forName("org.quiltmc.loader.api.QuiltLoader");
isQuilt = true;
} catch (ClassNotFoundException e) {
isQuilt = false;
}
}
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.mixins; package com.seibel.lod.fabric.mixins;
import com.seibel.lod.fabric.Main; import com.seibel.lod.fabric.Main;
@@ -1,40 +0,0 @@
package com.seibel.lod.fabric.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.mojang.blaze3d.systems.RenderSystem;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton;
import net.minecraft.client.Camera;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.level.material.FogType;
@Mixin(FogRenderer.class)
public class MixinFogRenderer {
private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
// Using this instead of Float.MAX_VALUE because Sodium don't like it.
private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F;
private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F;
@Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZ)V")
private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) {
FogType fogTypes = camera.getFluidInCamera();
Entity entity = camera.getEntity();
boolean isUnderWater = (entity instanceof LivingEntity) && ((LivingEntity)entity).hasEffect(MobEffects.BLINDNESS);
if (!isUnderWater) {
if (fogMode == FogMode.FOG_TERRAIN && fogTypes == FogType.NONE && CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) {
RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE);
RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE);
}
}
}
}
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.mixins; package com.seibel.lod.fabric.mixins;
import com.seibel.lod.fabric.Main; import com.seibel.lod.fabric.Main;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.mixins; package com.seibel.lod.fabric.mixins;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@@ -16,7 +35,17 @@ import net.minecraft.Util;
@Mixin(Util.class) @Mixin(Util.class)
public class MixinUtilBackgroudThread public class MixinUtilBackgroudThread
{ {
@Inject(method = "backgroundExecutor", at = @At("HEAD"), cancellable = true)
private static void overrideUtil$backgroundExecutor(CallbackInfoReturnable<ExecutorService> ci)
{
if (ClientProxy.isGenerationThreadChecker != null && ClientProxy.isGenerationThreadChecker.get())
{
//ApiShared.LOGGER.info("util backgroundExecutor triggered");
ci.setReturnValue(new DummyRunExecutorService());
}
}
#if POST_MC_1_17_1
@Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Runnable;", @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Runnable;",
at = @At("HEAD"), cancellable = true) at = @At("HEAD"), cancellable = true)
private static void overrideUtil$wrapThreadWithTaskName(String string, Runnable r, CallbackInfoReturnable<Runnable> ci) private static void overrideUtil$wrapThreadWithTaskName(String string, Runnable r, CallbackInfoReturnable<Runnable> ci)
@@ -27,6 +56,8 @@ public class MixinUtilBackgroudThread
ci.setReturnValue(r); ci.setReturnValue(r);
} }
} }
#endif
#if POST_MC_1_18_1
@Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/util/function/Supplier;)Ljava/util/function/Supplier;", @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/util/function/Supplier;)Ljava/util/function/Supplier;",
at = @At("HEAD"), cancellable = true) at = @At("HEAD"), cancellable = true)
private static void overrideUtil$wrapThreadWithTaskNameForSupplier(String string, Supplier<?> r, CallbackInfoReturnable<Supplier<?>> ci) private static void overrideUtil$wrapThreadWithTaskNameForSupplier(String string, Supplier<?> r, CallbackInfoReturnable<Supplier<?>> ci)
@@ -37,14 +68,6 @@ public class MixinUtilBackgroudThread
ci.setReturnValue(r); ci.setReturnValue(r);
} }
} }
#endif
@Inject(method = "backgroundExecutor", at = @At("HEAD"), cancellable = true)
private static void overrideUtil$backgroundExecutor(CallbackInfoReturnable<ExecutorService> ci)
{
if (ClientProxy.isGenerationThreadChecker != null && ClientProxy.isGenerationThreadChecker.get())
{
//ApiShared.LOGGER.info("util backgroundExecutor triggered");
ci.setReturnValue(new DummyRunExecutorService());
}
}
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.mixins.events; package com.seibel.lod.fabric.mixins.events;
import com.seibel.lod.fabric.Main; import com.seibel.lod.fabric.Main;
@@ -1,13 +1,34 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.mixins.events; package com.seibel.lod.fabric.mixins.events;
import com.seibel.lod.fabric.Main; import com.seibel.lod.fabric.Main;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelRenderer;
#if MC_VERSION_1_18_2 #if POST_MC_1_18_2
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
#endif #endif
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -20,27 +41,26 @@ import java.util.function.Supplier;
/** /**
* This class is used for world loading events * This class is used for world loading events
* @author Ran * @author Ran
*
* FIXME: Why does forge not have the 1.18+ onChunkLightReady mixin?
*/ */
@Mixin(ClientLevel.class) @Mixin(ClientLevel.class)
public class MixinClientLevel { public class MixinClientLevel {
#if MC_VERSION_1_18_2
@Inject(method = "<init>", at = @At("TAIL")) @Inject(method = "<init>", at = @At("TAIL"))
private void loadWorldEvent(ClientPacketListener clientPacketListener, ClientLevel.ClientLevelData clientLevelData, ResourceKey resourceKey, Holder holder, int i, int j, Supplier supplier, LevelRenderer levelRenderer, boolean bl, long l, CallbackInfo ci) { private void loadWorldEvent(ClientPacketListener clientPacketListener, ClientLevel.ClientLevelData clientLevelData, ResourceKey resourceKey,
#if POST_MC_1_18_2 Holder holder, #else DimensionType dimensionType, #endif int i,
#if POST_MC_1_18_1 int j, #endif Supplier supplier, LevelRenderer levelRenderer, boolean bl, long l, CallbackInfo ci) {
Main.client_proxy.worldLoadEvent((ClientLevel) (Object) this); Main.client_proxy.worldLoadEvent((ClientLevel) (Object) this);
} }
#elif MC_VERSION_1_18_1
@Inject(method = "<init>", at = @At("TAIL"))
private void loadWorldEvent(ClientPacketListener clientPacketListener, ClientLevel.ClientLevelData clientLevelData, ResourceKey resourceKey, DimensionType dimensionType, int i, int j, Supplier supplier, LevelRenderer levelRenderer, boolean bl, long l, CallbackInfo ci) {
Main.client_proxy.worldLoadEvent((ClientLevel) (Object) this);
}
#endif
#if POST_MC_1_18_1
@Inject(method = "setLightReady", at = @At("HEAD")) @Inject(method = "setLightReady", at = @At("HEAD"))
private void onChunkLightReady(int x, int z, CallbackInfo ci) { private void onChunkLightReady(int x, int z, CallbackInfo ci) {
ClientLevel l = (ClientLevel) (Object) this; ClientLevel l = (ClientLevel) (Object) this;
LevelChunk chunk = l.getChunkSource().getChunk(x, z, false); LevelChunk chunk = l.getChunkSource().getChunk(x, z, false);
if (chunk!=null && !chunk.isClientLightReady()) if (chunk!=null&& !chunk.isClientLightReady())
Main.client_proxy.chunkLoadEvent(l, chunk); Main.client_proxy.chunkLoadEvent(l, chunk);
} }
#endif
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.mixins.events; package com.seibel.lod.fabric.mixins.events;
import com.seibel.lod.fabric.Main; import com.seibel.lod.fabric.Main;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.mixins.events; package com.seibel.lod.fabric.mixins.events;
import com.seibel.lod.fabric.Main; import com.seibel.lod.fabric.Main;
@@ -14,13 +33,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
*/ */
@Mixin(ServerLevel.class) @Mixin(ServerLevel.class)
public class MixinServerLevel { public class MixinServerLevel {
#if PRE_MC_1_17_1
@Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;save(Z)V", shift = At.Shift.AFTER))
private void saveWorldEvent(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) {
Main.client_proxy.worldSaveEvent();
}
#else
@Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;saveAll()V", shift = At.Shift.AFTER)) @Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;saveAll()V", shift = At.Shift.AFTER))
private void saveWorldEvent_sA(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) { private void saveWorldEvent_sA(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) {
Main.client_proxy.worldSaveEvent(); Main.client_proxy.worldSaveEvent();
} }
@Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;autoSave()V", shift = At.Shift.AFTER)) @Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;autoSave()V", shift = At.Shift.AFTER))
private void saveWorldEvent_aS(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) { private void saveWorldEvent_aS(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) {
Main.client_proxy.worldSaveEvent(); Main.client_proxy.worldSaveEvent();
} }
#endif
} }
@@ -1,26 +0,0 @@
package com.seibel.lod.fabric.mixins.unsafe;
import net.minecraft.util.ThreadingDetector;
import org.spongepowered.asm.mixin.Mixin;
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)
*/
@Mixin(ThreadingDetector.class)
public class MixinThreadingDectector {
@Mutable
@Shadow
private Semaphore lock;
@Inject(method = "<init>", at = @At("RETURN"))
private void setSemaphore(CallbackInfo ci) {
this.lock = new Semaphore(2);
}
}
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.networking; package com.seibel.lod.fabric.networking;
import com.seibel.lod.common.networking.NetworkInterface; import com.seibel.lod.common.networking.NetworkInterface;
@@ -0,0 +1,14 @@
package com.seibel.lod.fabric.quilt;
/**
* Used to call classes that are in Quilt
* @author Ran
*/
public class QuiltUtils {
public static boolean isModLoaded(String modId) {
try {
return (boolean) Class.forName("org.quiltmc.loader.api.QuiltLoader").getDeclaredMethod("isModLoaded", String.class).invoke(null, modId);
} catch (Exception ignored) { }
return false;
}
}
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.wrappers; package com.seibel.lod.fabric.wrappers;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.wrappers.config; package com.seibel.lod.fabric.wrappers.config;
import com.seibel.lod.common.wrappers.config.ConfigGui; import com.seibel.lod.common.wrappers.config.ConfigGui;
@@ -1,6 +1,27 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.wrappers.modAccessor; package com.seibel.lod.fabric.wrappers.modAccessor;
import com.seibel.lod.core.wrapperInterfaces.modAccessor.IModChecker; import com.seibel.lod.core.wrapperInterfaces.modAccessor.IModChecker;
import com.seibel.lod.fabric.Main;
import com.seibel.lod.fabric.quilt.QuiltUtils;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
public class ModChecker implements IModChecker { public class ModChecker implements IModChecker {
@@ -8,6 +29,10 @@ public class ModChecker implements IModChecker {
@Override @Override
public boolean isModLoaded(String modid) { public boolean isModLoaded(String modid) {
return FabricLoader.getInstance().isModLoaded(modid); if (Main.isQuilt) {
return QuiltUtils.isModLoaded(modid);
} else {
return FabricLoader.getInstance().isModLoaded(modid);
}
} }
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.wrappers.modAccessor; package com.seibel.lod.fabric.wrappers.modAccessor;
import java.util.HashSet; import java.util.HashSet;
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.wrappers.modAccessor; package com.seibel.lod.fabric.wrappers.modAccessor;
import java.util.HashSet; import java.util.HashSet;
@@ -6,37 +25,93 @@ import java.util.stream.Collectors;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory; import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.lod.core.wrapperInterfaces.chunk.AbstractChunkPosWrapper; import com.seibel.lod.core.wrapperInterfaces.chunk.AbstractChunkPosWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor;
import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
#if PRE_MC_1_17_1
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.protocol.Packet;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.phys.AABB;
#else
import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelHeightAccessor;
#endif
public class SodiumAccessor implements ISodiumAccessor { public class SodiumAccessor implements ISodiumAccessor {
IWrapperFactory factory = SingletonHandler.get(IWrapperFactory.class); private final IWrapperFactory factory = SingletonHandler.get(IWrapperFactory.class);
private final IMinecraftRenderWrapper MC_RENDER = SingletonHandler.get(IMinecraftRenderWrapper.class);
@Override @Override
public String getModName() { public String getModName() {
return "Sodium-Fabric-1.18.X"; return "Sodium-Fabric";
} }
#if POST_MC_1_17_1
@Override @Override
public HashSet<AbstractChunkPosWrapper> getNormalRenderedChunks() { public HashSet<AbstractChunkPosWrapper> getNormalRenderedChunks() {
SodiumWorldRenderer renderer = SodiumWorldRenderer.instance(); SodiumWorldRenderer renderer = SodiumWorldRenderer.instance();
LevelHeightAccessor height = Minecraft.getInstance().level; LevelHeightAccessor height = Minecraft.getInstance().level;
#if POST_MC_1_18_1
// 0b11 = Lighted chunk & loaded chunk // 0b11 = Lighted chunk & loaded chunk
return renderer.getChunkTracker().getChunks(0b00).filter( return renderer.getChunkTracker().getChunks(0b00).filter(
(long l) -> { (long l) -> {
return true; return true;
//for (int i = height.getMinSection(); i<height.getMaxSection(); i++) {
// SectionPos p = SectionPos.of(new ChunkPos(l), i);
// if (renderer.isBoxVisible(p.minBlockX()+1, p.minBlockY()+1, p.minBlockZ()+1,
// p.maxBlockX()-1, p.maxBlockY()-1, p.maxBlockZ()-1)) return true;
//}
//return false;
}).mapToObj((long l) -> { }).mapToObj((long l) -> {
return (AbstractChunkPosWrapper)factory.createChunkPos(l); return (AbstractChunkPosWrapper)factory.createChunkPos(l);
}).collect(Collectors.toCollection(HashSet::new)); }).collect(Collectors.toCollection(HashSet::new));
#else
// TODO: Maybe use a mixin to make this more efficient, and maybe ignore changes behind the camera
return MC_RENDER.getMaximumRenderedChunks().stream().filter((AbstractChunkPosWrapper chunk) -> {
return (renderer.isBoxVisible(
chunk.getMinBlockX()+1, height.getMinBuildHeight()+1, chunk.getMinBlockZ()+1,
chunk.getMinBlockX()+15, height.getMaxBuildHeight()-1, chunk.getMinBlockZ()+15));
}).collect(Collectors.toCollection(HashSet::new));
#endif
}
#else
@Override
public HashSet<AbstractChunkPosWrapper> getNormalRenderedChunks() {
SodiumWorldRenderer renderer = SodiumWorldRenderer.getInstance();
LevelAccessor height = Minecraft.getInstance().level;
// TODO: Maybe use a mixin to make this more efficient
return MC_RENDER.getMaximumRenderedChunks().stream().filter((AbstractChunkPosWrapper chunk) -> {
FakeChunkEntity AABB = new FakeChunkEntity(chunk.getX(), chunk.getZ(), height.getMaxBuildHeight());
return (renderer.isEntityVisible(AABB));
}).collect(Collectors.toCollection(HashSet::new));
} }
private static class FakeChunkEntity extends Entity {
public int cx;
public int cz;
public int my;
public FakeChunkEntity(int chunkX, int chunkZ, int maxHeight) {
super(EntityType.AREA_EFFECT_CLOUD, null);
cx = chunkX;
cz = chunkZ;
my = maxHeight;
}
@Override
public AABB getBoundingBoxForCulling() {
return new AABB(cx*16+1, 1, cz*16+1,
cx*16+15, my-1, cz*16+15);
}
@Override
protected void defineSynchedData() {}
@Override
protected void readAdditionalSaveData(CompoundTag paramCompoundTag) {}
@Override
protected void addAdditionalSaveData(CompoundTag paramCompoundTag) {}
@Override
public Packet<?> getAddEntityPacket() {
throw new UnsupportedOperationException("This is a FAKE CHUNK ENTITY... For tricking the Sodium to check a AABB.");
}
}
#endif
} }
@@ -1,3 +1,22 @@
/*
* This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020-2022 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.fabric.wrappers.modAccessor; package com.seibel.lod.fabric.wrappers.modAccessor;
import com.seibel.lod.core.wrapperInterfaces.modAccessor.IStarlightAccessor; import com.seibel.lod.core.wrapperInterfaces.modAccessor.IStarlightAccessor;
@@ -2,17 +2,12 @@
"required": true, "required": true,
"minVersion": "0.8", "minVersion": "0.8",
"package": "com.seibel.lod.fabric.mixins", "package": "com.seibel.lod.fabric.mixins",
"compatibilityLevel": "JAVA_17",
"mixins": [ "mixins": [
"unsafe.MixinThreadingDectector",
"MixinUtilBackgroudThread", "MixinUtilBackgroudThread",
"events.MixinServerLevel" "events.MixinServerLevel"
], ],
"client": [ "client": [
"MixinMinecraft", "MixinMinecraft",
"MixinOptionsScreen",
"MixinWorldRenderer",
"MixinFogRenderer",
"events.MixinClientLevel", "events.MixinClientLevel",
"events.MixinMinecraft", "events.MixinMinecraft",
"events.MixinBlockUpdate" "events.MixinBlockUpdate"
+7 -10
View File
@@ -5,7 +5,7 @@
"name": "${mod_name}", "name": "${mod_name}",
"description": "${description}", "description": "${description}",
"authors": ["${authors}"], "authors": $authors,
"contact": { "contact": {
"homepage": "${homepage}", "homepage": "${homepage}",
@@ -18,28 +18,25 @@
"environment": "client", "environment": "client",
"entrypoints": { "entrypoints": {
"client": [
"com.seibel.lod.fabric.Main"
],
"modmenu": [ "modmenu": [
"com.seibel.lod.fabric.wrappers.config.ModMenuIntegration" "com.seibel.lod.fabric.wrappers.config.ModMenuIntegration"
] ]
}, },
"mixins": [ "mixins": [
"fabric.lod.mixins.json" "fabric.lod.mixins.json",
"fabric-like.lod.mixins.json"
], ],
"accessWidener" : "lod.accesswidener", "accessWidener" : "lod.accesswidener",
"depends": { "depends": {
"fabricloader": "*", "fabricloader": "*",
"fabric": "*", "fabric-lifecycle-events-v1": "*",
"minecraft": "${minecraft_version}", "fabric-key-binding-api-v1": "*",
"fabric-networking-api-v1": "*",
"minecraft": $compatible_minecraft_versions,
"java": ">=${java_version}" "java": ">=${java_version}"
}, },
"suggests": {
"another-mod": "*"
},
"custom": { "custom": {
"modmenu": { "modmenu": {
+5 -13
View File
@@ -1,12 +1,10 @@
plugins { plugins {
id "com.github.johnrengelman.shadow" version "7.1.0" id "com.github.johnrengelman.shadow" version "7.1.2"
} }
version = rootProject.mod_version+"-"+rootProject.minecraft_version+"-"+new Date().format("yyyy_MM_dd_HH_mm") version = rootProject.mod_version+"-"+rootProject.minecraft_version+"-"+new Date().format("yyyy_MM_dd_HH_mm")
loom { loom {
accessWidenerPath.set(project(":common").file("src/main/resources/lod.accesswidener"))
forge { forge {
convertAccessWideners.set(true) convertAccessWideners.set(true)
extraAccessWideners.add("lod.accesswidener") extraAccessWideners.add("lod.accesswidener")
@@ -40,6 +38,8 @@ dependencies {
addMod("curse.maven:starlight-forge-526854:${rootProject.starlight_version_forge}", rootProject.enable_starlight_forge) addMod("curse.maven:starlight-forge-526854:${rootProject.starlight_version_forge}", rootProject.enable_starlight_forge)
annotationProcessor "org.spongepowered:mixin:0.8.4:processor" annotationProcessor "org.spongepowered:mixin:0.8.4:processor"
addMod("curse.maven:TerraForged-363820:${rootProject.terraforged_version}", rootProject.enable_terraforged)
common(project(path: ":common", configuration: "namedElements")) { transitive false } common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowMe(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } shadowMe(project(path: ":common", configuration: "transformProductionForge")) { transitive = false }
@@ -56,22 +56,14 @@ dependencies {
shadowMe 'org.apache.commons:commons-compress:1.21' shadowMe 'org.apache.commons:commons-compress:1.21'
} }
task copyCoreResources(type: Copy) {
from fileTree(project(":core").file("src/main/resources"))
into file("build/resources/main")
}
task copyCommonResources(type: Copy) {
from fileTree(project(":common").file("src/main/resources"))
into file("build/resources/main")
}
processResources { processResources {
dependsOn(copyAccessWidener)
dependsOn(copyCoreResources) dependsOn(copyCoreResources)
dependsOn(copyCommonResources) dependsOn(copyCommonResources)
} }
shadowJar { shadowJar {
exclude "architectury.common.json"
dependencies { dependencies {
exclude(dependency("net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}")) exclude(dependency("net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"))
} }
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -23,6 +23,9 @@ import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.api.EventApi; import com.seibel.lod.core.api.EventApi;
import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.world.entity.player.Player;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.seibel.lod.common.wrappers.chunk.ChunkWrapper; import com.seibel.lod.common.wrappers.chunk.ChunkWrapper;
@@ -74,6 +77,7 @@ public class ForgeClientProxy
@SubscribeEvent @SubscribeEvent
public void worldLoadEvent(WorldEvent.Load event) public void worldLoadEvent(WorldEvent.Load event)
{ {
if (Minecraft.getInstance().screen instanceof TitleScreen) return;
if (event.getWorld() != null) { if (event.getWorld() != null) {
eventApi.worldLoadEvent(WorldWrapper.getWorldWrapper(event.getWorld())); eventApi.worldLoadEvent(WorldWrapper.getWorldWrapper(event.getWorld()));
} }
@@ -1,8 +1,8 @@
/* /*
* This file is part of the Distant Horizon mod (formerly the LOD Mod), * This file is part of the Distant Horizons mod (formerly the LOD Mod),
* licensed under the GNU GPL v3 License. * licensed under the GNU GPL v3 License.
* *
* Copyright (C) 2020 James Seibel * Copyright (C) 2020-2022 James Seibel
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -27,21 +27,19 @@ import com.seibel.lod.core.ModInfo;
import com.seibel.lod.core.api.ApiShared; import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.handlers.ReflectionHandler; import com.seibel.lod.core.handlers.ReflectionHandler;
import com.seibel.lod.core.handlers.dependencyInjection.ModAccessorHandler; import com.seibel.lod.core.handlers.dependencyInjection.ModAccessorHandler;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.wrapperInterfaces.modAccessor.IModChecker;
import com.seibel.lod.core.wrapperInterfaces.modAccessor.IOptifineAccessor; import com.seibel.lod.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
import com.seibel.lod.forge.networking.NetworkHandler; import com.seibel.lod.forge.networking.NetworkHandler;
import com.seibel.lod.forge.wrappers.ForgeDependencySetup; import com.seibel.lod.forge.wrappers.ForgeDependencySetup;
import com.seibel.lod.forge.wrappers.modAccessor.ModChecker;
import com.seibel.lod.forge.wrappers.modAccessor.OptifineAccessor; import com.seibel.lod.forge.wrappers.modAccessor.OptifineAccessor;
import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.level.ColorResolver;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.data.ModelDataMap; import net.minecraftforge.client.model.data.ModelDataMap;
import net.minecraftforge.client.ConfigGuiHandler;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@@ -49,6 +47,13 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.fml.loading.FMLLoader;
#if PRE_MC_1_17_1
import net.minecraftforge.fml.ExtensionPoint;
#elif MC_1_17_1
import net.minecraftforge.fmlclient.ConfigGuiHandler;
#else // 1.18+
import net.minecraftforge.client.ConfigGuiHandler;
#endif
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
@@ -91,8 +96,13 @@ public class ForgeMain implements LodForgeMethodCaller
ModAccessorHandler.finishBinding(); ModAccessorHandler.finishBinding();
#if PRE_MC_1_17_1
ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY,
() -> (client, parent) -> ConfigGui.getScreen(parent, ""));
#else
ModLoadingContext.get().registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, ModLoadingContext.get().registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class,
() -> new ConfigGuiHandler.ConfigGuiFactory((client, parent) -> ConfigGui.getScreen(parent, ""))); () -> new ConfigGuiHandler.ConfigGuiFactory((client, parent) -> ConfigGui.getScreen(parent, "")));
#endif
forgeClientProxy = new ForgeClientProxy(); forgeClientProxy = new ForgeClientProxy();
MinecraftForge.EVENT_BUS.register(forgeClientProxy); MinecraftForge.EVENT_BUS.register(forgeClientProxy);
} }
@@ -102,4 +112,14 @@ public class ForgeMain implements LodForgeMethodCaller
public List<BakedQuad> getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, Random random) { public List<BakedQuad> getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, Random random) {
return mc.getModelManager().getBlockModelShaper().getBlockModel(block.defaultBlockState()).getQuads(blockState, direction, random, dataMap); return mc.getModelManager().getBlockModelShaper().getBlockModel(block.defaultBlockState()).getQuads(blockState, direction, random, dataMap);
} }
@Override
public int colorResolverGetColor(ColorResolver resolver, Biome biome, double x, double z) {
#if MC_1_17_1
return resolver.m_130045_(biome, x, z);
#else
return resolver.getColor(biome, x, z);
#endif
}
} }
@@ -1,199 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.seibel.lod.forge.fabric.api.networking.v1;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
import java.util.stream.Collectors;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Vec3i;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.chunk.ChunkSource;
import net.minecraft.world.phys.Vec3;
import com.seibel.lod.forge.mixins.fabric.mixin.networking.accessor.EntityTrackerAccessor;
import com.seibel.lod.forge.mixins.fabric.mixin.networking.accessor.ThreadedAnvilChunkStorageAccessor;
/**
* For example, a block entity may use the methods in this class to send a packet to all clients which can see the block entity in order notify clients about a change.
*
* <p>The word "tracking" means that an entity/chunk on the server is known to a player's client (within in view distance) and the (block) entity should notify tracking clients of changes.
*
* <p>These methods should only be called on the server thread and only be used on logical a server.
*/
public final class PlayerLookup {
/**
* Gets all the players on the minecraft server.
*
* <p>The returned collection is immutable.
*
* @param server the server
* @return all players on the server
*/
public static Collection<ServerPlayer> all(MinecraftServer server) {
Objects.requireNonNull(server, "The server cannot be null");
// return an immutable collection to guard against accidental removals.
if (server.getPlayerList() != null) {
return Collections.unmodifiableCollection(server.getPlayerList().getPlayers());
}
return Collections.emptyList();
}
/**
* Gets all the players in a server world.
*
* <p>The returned collection is immutable.
*
* @param world the server world
* @return the players in the server world
*/
public static Collection<ServerPlayer> world(ServerLevel world) {
Objects.requireNonNull(world, "The world cannot be null");
// return an immutable collection to guard against accidental removals.
return Collections.unmodifiableCollection(world.players());
}
/**
* Gets all players tracking a chunk in a server world.
*
* @param world the server world
* @param pos the chunk in question
* @return the players tracking the chunk
*/
public static Collection<ServerPlayer> tracking(ServerLevel world, ChunkPos pos) {
Objects.requireNonNull(world, "The world cannot be null");
Objects.requireNonNull(pos, "The chunk pos cannot be null");
return world.getChunkSource().chunkMap.getPlayers(pos, false);
}
/**
* Gets all players tracking an entity in a server world.
*
* <p>The returned collection is immutable.
*
* <p><b>Warning</b>: If the provided entity is a player, it is not
* guaranteed by the contract that said player is included in the
* resulting stream.
*
* @param entity the entity being tracked
* @return the players tracking the entity
* @throws IllegalArgumentException if the entity is not in a server world
*/
public static Collection<ServerPlayer> tracking(Entity entity) {
Objects.requireNonNull(entity, "Entity cannot be null");
ChunkSource manager = entity.level.getChunkSource();
if (manager instanceof ServerChunkCache) {
ChunkMap storage = ((ServerChunkCache) manager).chunkMap;
EntityTrackerAccessor tracker = ((ThreadedAnvilChunkStorageAccessor) storage).getEntityMap().get(entity.getId());
// return an immutable collection to guard against accidental removals.
if (tracker != null) {
return Collections.unmodifiableCollection(tracker.getPlayersTracking()
.stream().map(ServerPlayerConnection::getPlayer).collect(Collectors.toSet()));
}
return Collections.emptySet();
}
throw new IllegalArgumentException("Only supported on server worlds!");
}
/**
* Gets all players tracking a block entity in a server world.
*
* @param blockEntity the block entity
* @return the players tracking the block position
* @throws IllegalArgumentException if the block entity is not in a server world
*/
public static Collection<ServerPlayer> tracking(BlockEntity blockEntity) {
Objects.requireNonNull(blockEntity, "BlockEntity cannot be null");
//noinspection ConstantConditions - IJ intrinsics don't know hasWorld == true will result in no null
if (!blockEntity.hasLevel() || blockEntity.getLevel().isClientSide()) {
throw new IllegalArgumentException("Only supported on server worlds!");
}
return tracking((ServerLevel) blockEntity.getLevel(), blockEntity.getBlockPos());
}
/**
* Gets all players tracking a block position in a server world.
*
* @param world the server world
* @param pos the block position
* @return the players tracking the block position
*/
public static Collection<ServerPlayer> tracking(ServerLevel world, BlockPos pos) {
Objects.requireNonNull(pos, "BlockPos cannot be null");
return tracking(world, new ChunkPos(pos));
}
/**
* Gets all players around a position in a world.
*
* <p>The distance check is done in the three-dimensional space instead of in the horizontal plane.
*
* @param world the world
* @param pos the position
* @param radius the maximum distance from the position in blocks
* @return the players around the position
*/
public static Collection<ServerPlayer> around(ServerLevel world, Vec3 pos, double radius) {
double radiusSq = radius * radius;
return world(world)
.stream()
.filter((p) -> p.distanceToSqr(pos) <= radiusSq)
.collect(Collectors.toList());
}
/**
* Gets all players around a position in a world.
*
* <p>The distance check is done in the three-dimensional space instead of in the horizontal plane.
*
* @param world the world
* @param pos the position (can be a block pos)
* @param radius the maximum distance from the position in blocks
* @return the players around the position
*/
public static Collection<ServerPlayer> around(ServerLevel world, Vec3i pos, double radius) {
double radiusSq = radius * radius;
return world(world)
.stream()
.filter((p) -> p.distanceToSqr(pos.getX(), pos.getY(), pos.getZ()) <= radiusSq)
.collect(Collectors.toList());
}
private PlayerLookup() {
}
}
@@ -24,15 +24,15 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import org.slf4j.LoggerFactory; import org.apache.logging.log4j.LogManager;
import org.slf4j.Logger;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import com.seibel.lod.forge.fabric.api.event.Event; import com.seibel.lod.forge.fabric.api.event.Event;
import org.apache.logging.log4j.Logger;
class ArrayBackedEvent<T> extends Event<T> { class ArrayBackedEvent<T> extends Event<T> {
static final Logger LOGGER = LoggerFactory.getLogger("fabric-api-base"); static final Logger LOGGER = LogManager.getLogger("fabric-api-base");
private final Function<T[], T> invokerFactory; private final Function<T[], T> invokerFactory;
private final Object lock = new Object(); private final Object lock = new Object();
@@ -26,8 +26,8 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import org.slf4j.LoggerFactory; import org.apache.logging.log4j.LogManager;
import org.slf4j.Logger; import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
/** /**
@@ -47,7 +47,7 @@ public abstract class AbstractNetworkAddon<H> {
protected AbstractNetworkAddon(GlobalReceiverRegistry<H> receiver, String description) { protected AbstractNetworkAddon(GlobalReceiverRegistry<H> receiver, String description) {
this.receiver = receiver; this.receiver = receiver;
this.logger = LoggerFactory.getLogger(description); this.logger = LogManager.getLogger(description);
} }
@Nullable @Nullable
@@ -21,8 +21,8 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import org.slf4j.LoggerFactory; import org.apache.logging.log4j.LogManager;
import org.slf4j.Logger; import org.apache.logging.log4j.Logger;
import com.seibel.lod.forge.fabric.api.networking.v1.PacketByteBufs; import com.seibel.lod.forge.fabric.api.networking.v1.PacketByteBufs;
import com.seibel.lod.forge.fabric.api.networking.v1.ServerLoginConnectionEvents; import com.seibel.lod.forge.fabric.api.networking.v1.ServerLoginConnectionEvents;
import com.seibel.lod.forge.fabric.api.networking.v1.ServerLoginNetworking; import com.seibel.lod.forge.fabric.api.networking.v1.ServerLoginNetworking;
@@ -31,7 +31,7 @@ import net.minecraft.resources.ResourceLocation;
public final class NetworkingImpl { public final class NetworkingImpl {
public static final String MOD_ID = "fabric-networking-api-v1"; public static final String MOD_ID = "fabric-networking-api-v1";
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static final Logger LOGGER = LogManager.getLogger(MOD_ID);
/** /**
* Id of packet used to register supported channels. * Id of packet used to register supported channels.
*/ */

Some files were not shown because too many files have changed in this diff Show More