Compare commits

...

3377 Commits

Author SHA1 Message Date
James Seibel 3faf25636d remove dev from version number 2025-03-25 07:16:56 -05:00
James Seibel ab3bfbefb4 remove version from clean in buildall.bat 2025-03-25 07:16:07 -05:00
James Seibel 890e802de4 add execution policy for python script 2025-03-25 07:15:52 -05:00
James Seibel c13bc0cd6e Fix forge 1.18.2 dedicated server crash on startup 2025-03-20 07:08:21 -05:00
James Seibel 7143b7de08 Add config to only log GL errors once 2025-03-19 22:02:57 -05:00
James Seibel d136d782f5 Attempt to fix Linux complaining about glIsFramebuffer() 2025-03-19 18:34:06 -05:00
James Seibel 29a160316c Potentially fix LAN connections on neo/forge 2025-03-19 17:34:03 -05:00
James Seibel 1f6f64d322 Potentially fix GL errors when accessing the default FBO on Linux 2025-03-19 17:00:36 -05:00
James Seibel 37c0af529d Fix restoring textures to the default FBO 2025-03-18 20:18:30 -05:00
James Seibel 1341ea3f3d Attempt to fix GL errors on Linux during buffer cleanup
Attempt to fix #950
2025-03-18 19:51:22 -05:00
James Seibel c0bb120669 Add stack tracing to GL error logging 2025-03-18 18:10:25 -05:00
James Seibel f8887e403f fix passing in the wrong flags to glBufferStorage()
Might Resolve #964 and #950
2025-03-18 07:43:23 -05:00
James Seibel 949ee423c8 Fix changing graphics settings on world load via API 2025-03-16 14:30:04 -05:00
James Seibel b19ed3f30c Fix GL error logging 2025-03-14 10:18:03 -05:00
James Seibel 2d085e1074 Add additional error checking/handling to Shader compiling 2025-03-13 21:12:34 -05:00
James Seibel 6ba0490cf7 Closes !950 (Texture name does not refer to a texture object) 2025-03-13 18:09:43 -05:00
James Seibel b6a0878241 up version number 2.3.0-b -> 2.3.1-b-dev
Also fix compiling for release builds
2025-03-08 08:11:14 -06:00
James Seibel 50f5371084 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-03-06 07:43:29 -06:00
James Seibel df74b8d243 Update coreSubProjects 2025-03-06 07:43:22 -06:00
James Seibel fce2868c62 remove dev from version number for release 2025-03-06 07:41:52 -06:00
s809 a36cd0763b Add some debugging info for DTOs 2025-03-02 20:09:11 +05:00
James Seibel 0fba015f54 Fix crashing on MC 1.20.1 and older when updates aren't found 2 2025-03-01 09:19:52 -06:00
James Seibel f251c90472 Fix crashing on MC 1.20.1 and older when updates aren't found 2025-03-01 09:13:47 -06:00
s809 492a051a3b Replace chunk counts with speed in pregen 2025-02-27 21:08:31 +05:00
s809 0aa4743c1b Should be division instead of multiplication 2025-02-26 23:17:05 +05:00
s809 85f16944b2 Offset generation bounds by teleportation scale 2025-02-26 22:13:43 +05:00
James Seibel dddb0be2ac duct tape fix to reduce chance of LOD uploading requiring MC reboot 2025-02-25 07:26:12 -06:00
s809 4a3effa2f5 Remember split section responses temporarily 2025-02-22 20:55:18 +05:00
s809 a0a9151bfd Fix foreground thread sometimes blocking server shutdown 2025-02-19 21:17:42 +05:00
s809 aa3d15f38f Show section numbers in pregen 2025-02-19 20:37:29 +05:00
James Seibel adcb2a3a05 Fix IDhApiConfigValue.clearValue() failing for some deprecated functions 2025-02-17 21:16:27 -06:00
James Seibel 78f2cb24cc Fix DB leaks in FullDataV2Repo 2025-02-16 20:07:13 -06:00
James Seibel 67945509ed Fix errors related to player pos being unloaded 2025-02-16 19:54:11 -06:00
James Seibel c653e526a5 Revert 10 minute memoization for world gen 2025-02-15 11:56:25 -06:00
James Seibel 49b50c4c88 Fix beacon culling with auto overdraw prevention 2025-02-15 11:12:57 -06:00
James Seibel 7449f46c5e Add missing cave blocks for cave culling 2025-02-15 11:06:57 -06:00
James Seibel 069fc39aad up fabric api version for 1.21.1 to allow Immersive Portals testing 2025-02-14 07:48:32 -06:00
s809 4979ccf3e2 Invert generateOnlyInHighestDetail and rename to enableNSizedGeneration 2025-02-11 22:08:29 +05:00
James Seibel dd7f9c20b6 Put N-sized generation and upsampling behind experimental configs 2025-02-11 07:47:36 -06:00
James Seibel e96f9de1f0 Fix dimension wrapper creating duplicates for the same name 2025-02-11 07:05:34 -06:00
James Seibel c902e1957f Fix auto updater failing for nightly builds 2025-02-10 07:47:03 -06:00
James Seibel d40afb7a2a Fix C2ME slowdown again 2025-02-08 21:43:49 -06:00
James Seibel 01474d72e3 remove unneeded IVersionConstant methods 2025-02-08 11:39:26 -06:00
James Seibel 7c5af1836b add FIXME comment related to getChunkNbtDataAsync()
this method appears to be called much more often than it should be, very often 25 times per chunk position.
Very strange.
2025-02-08 11:12:06 -06:00
James Seibel a9bf6ae7e4 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-02-08 10:46:16 -06:00
James Seibel aef3162246 reduce test N-sized generator height 2025-02-08 10:45:55 -06:00
James Seibel 97ce869076 Fix C2ME causing memory use to explode with DH world gen 2025-02-08 10:45:38 -06:00
s809 91b3c83ffd Update core 2025-02-07 23:23:25 +05:00
James Seibel 1522df19cb Attempt to fix threadpool shutdown rejection exception 2025-02-07 07:26:07 -06:00
James Seibel 3845564128 Reduce world gen down time when using extremely fast generators 2025-02-07 07:15:31 -06:00
s809 23ef7cf27a Fix incorrect distance being used in update propagation SQL and reduce queue size 2025-02-07 01:05:18 +05:00
James Seibel bec28a5694 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-02-05 17:32:37 -06:00
James Seibel 8f20f103ad Fix empty data sources when moving in multiplayer or with N-sized world gen
Increases networking protocol from 9 -> 10
2025-02-05 17:32:30 -06:00
James Seibel 246e77cc56 Fix render enabled config getting set by world gen progress config 2025-02-02 19:55:06 -06:00
James Seibel 87fa29c77a Fix compiling with missing "E" 2025-02-02 15:52:20 -06:00
s809 5010256ce6 Update core 2025-02-02 20:30:57 +05:00
s809 a66ad19343 Balance tasks in thread pool using elapsed time instead of priorities 2025-02-02 20:30:04 +05:00
s809 913a458a1a Auto-move old save data to new location 2025-02-02 15:38:06 +05:00
s809 093d3a801e Remove generationProgressDisableMessageDisplayTimeInSeconds from server config command 2025-02-01 19:38:46 +05:00
s809 61ccf7bf60 Decrease delay between missing generation rechecks 2025-01-31 14:54:32 +05:00
s809 f948072253 Decrease delay between missing generation rechecks 2025-01-31 14:53:57 +05:00
s809 b748f27a1c Fix beacon beams flickering 2025-01-30 22:30:08 +05:00
s809 4dd4bb9ef0 Fix nightly self-updater after moving jars into zip root 2025-01-30 18:11:39 +05:00
s809 5051bde3b0 Add pycache into gitignore 2025-01-30 00:22:03 +05:00
s809 42cf639acc Merge branch 'test/artifacts-in-zip-root' 2025-01-30 00:21:02 +05:00
s809 9e6953a596 Fix relocation breaking runClient & runServer 2025-01-29 23:59:23 +05:00
s809 7f4f8a40eb Merge branch 'experimental/relocate_sqlite' 2025-01-29 23:23:36 +05:00
s809 89ca535a6f Add all the extra comments 2025-01-29 23:23:21 +05:00
s809 145182502e Do not relocate when python is not installed 2025-01-29 23:01:28 +05:00
s809 d61dfc9e03 Revert "Improve chunk processing throughput" 2025-01-28 22:56:52 +05:00
James Seibel 611d7d87ae Fix compiling for MC 1.19.2 and below 2025-01-26 18:12:01 -06:00
James Seibel 2f6a2d99ab Remove unneeded MixinLevelTicks (!73)
https://gitlab.com/distant-horizons-team/distant-horizons/-/merge_requests/73#note_2281882248
2025-01-26 17:47:32 -06:00
James Seibel d88ca0c98d Improve CPU usage and chunk update throughput 2025-01-26 17:13:28 -06:00
s809 0f64df7be0 Add missing enabled check 2025-01-26 22:08:17 +05:00
s809 23a1f0b025 Clean up code 2025-01-26 17:52:30 +05:00
s809 4a72e02550 Sign natives for mac 2025-01-25 18:25:58 +05:00
James Seibel 521bcdcc0f fix recalculate heightmap breaking stairs, slabs, and glass 2025-01-24 07:24:43 -06:00
s809 4eb20d5ce8 Fix using wrong path on linux 2025-01-24 11:28:51 +05:00
s809 3ad68aaf42 Merge branch 'main' into experimental/relocate_sqlite 2025-01-24 11:27:41 +05:00
s809 2a9a03771e Check if session is ready before ignoring local chunks 2025-01-24 11:20:49 +05:00
James Seibel 8f7823a4d2 Fix holes when moving with N-sized world gen/server side support 2025-01-23 19:45:25 -06:00
James Seibel cc4b965966 Speed up PhantomArrayListPool for large checkouts 2025-01-23 19:21:13 -06:00
s809 a6418de927 Merge branch 'main' into experimental/relocate_sqlite 2025-01-23 23:23:12 +05:00
s809 5303415d05 Ignore local chunks if realtime updates are enabled 2025-01-23 23:21:40 +05:00
s809 836515934f Fix column order check breaking on tiny columns 2 2025-01-23 00:18:38 +05:00
s809 228dc46d6b Fix column order check breaking on tiny columns 2025-01-23 00:15:18 +05:00
James Seibel a91f9670dc Show instructions to disable world gen progress message for short time 2025-01-21 07:49:36 -06:00
James Seibel 81313252f2 fix links in issue templates 2025-01-21 07:07:53 -06:00
s809 f65d411978 Fix task splitting causing generation of already generated sections 2025-01-21 17:26:58 +05:00
James Seibel 8c8a5ffeaf Fix cached RenderSource closing while in use 2025-01-20 21:51:24 -06:00
s809 68793fbe8d Process elf correctly 2025-01-21 00:33:43 +05:00
s809 d8401a8f49 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into experimental/relocate_sqlite 2025-01-20 23:39:16 +05:00
s809 07ff00f7c9 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
2025-01-20 11:00:29 +05:00
s809 fadaff1113 Add generation bounds 2025-01-20 10:59:33 +05:00
James Seibel ff6bf7b4c9 Fix beacons disappearing and not updating correctly
Note: there appears to still be some off-by-one errors, although they happen relatively infrequently in my testing.
2025-01-19 17:48:36 -06:00
s809 082b1224a8 Relocate sqlite library 2025-01-19 03:26:53 +05:00
s809 bc475373fc Add a check for duplicate config command names and fix duplicate name 2025-01-18 16:27:16 +05:00
s809 498e958eca Add a check for duplicate config command names and fix duplicate name 2025-01-18 16:26:42 +05:00
s809 82e0cfe0b4 Fix server not shutting down, again 2025-01-15 23:34:48 +05:00
James Seibel 31d89e3349 Reduce duplicate warning logs when handling old worlds 2025-01-14 21:17:57 -06:00
James Seibel a3775c1f88 remove unneeded debug log 2025-01-14 19:48:30 -06:00
s809 e070bf4244 More consistent names but reverse 2025-01-14 21:25:58 +05:00
s809 8287192cd0 More consistent names 2025-01-14 21:15:01 +05:00
s809 d40f4dfe19 Artifacts in zip root 4 2025-01-14 21:01:30 +05:00
s809 595cdf011a Artifacts in zip root 3 2025-01-14 20:56:44 +05:00
s809 96f2f8c3b2 Artifacts in zip root 2 2025-01-14 20:48:17 +05:00
s809 c883ded7c4 Artifacts in zip root 2025-01-14 20:39:21 +05:00
James Seibel 834269da67 Reduce holes when flying around a partially loaded world 2025-01-14 07:35:39 -06:00
James Seibel a9bebf03d5 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-01-14 07:04:24 -06:00
James Seibel 939f6304bf Put several queries in try-finally blocks 2025-01-14 07:04:11 -06:00
s809 6e9f466570 Release full data sources after sending to clients 2025-01-13 23:37:26 +05:00
James Seibel a0b5cc7a5c Fix potential world gen error if center chunk is missing 2025-01-13 07:31:50 -06:00
s809 82708d998d Use dynamic precision for displaying pregen status 2025-01-12 21:56:54 +05:00
James Seibel 613e444490 Remove year range from licensing headers
The license is still valid, now I just don't have to update them every year
2025-01-11 21:27:25 -06:00
James Seibel f493e201d4 Add commented out logic for LevelChunkSection cloning
It was far to difficult a task for a issue I've only ever heard about once
2025-01-11 21:16:15 -06:00
James Seibel 2a8013b1d6 reminder comment about potential LodQuadTree concurrent issue 2025-01-11 21:06:58 -06:00
James Seibel 54fed62507 Add automatic overdraw prevention to improve fading 2025-01-11 17:59:27 -06:00
James Seibel e51bec9ce4 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-01-11 14:56:39 -06:00
s809 e47a83b706 Pregen improvements 2025-01-11 23:55:23 +05:00
James Seibel 8029c7b00c Fix some generic object rendering concurrent modification issues 2025-01-11 09:35:36 -06:00
James Seibel 2b38dc2575 Fix GL state corruption for mods not using MC's GlStateManager
This specifically fixes a bug with Iris where `GL46C.glDisable(GL46C.GL_CULL_FACE);` is called (instead of `GlStateManager._disableCull()`) during the transparent rendering pass, causing vanilla MC water chunks to have their normals inverted.
2025-01-11 08:24:28 -06:00
James Seibel 46cafb4cbe Fix compiling, forgot to move some QuadTree objects 2025-01-10 22:16:23 -06:00
James Seibel ff96533c93 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-01-10 22:00:24 -06:00
James Seibel 89e73f6383 Fix rendering LODs from different levels after changing dimensions 2025-01-10 21:57:57 -06:00
s809 069ebfe24e Add pregen command 2025-01-11 02:55:09 +05:00
s809 8b374c4734 Fix compilation 2025-01-11 02:54:30 +05:00
James Seibel 1febade083 Improve initial LOD loading speed and add KeyedLockContainer 2025-01-10 07:26:44 -06:00
James Seibel deedd85914 Fix delayedSaveCache and fix slow LOD updating regression 2025-01-09 21:27:00 -06:00
James Seibel 218c27adae Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-01-09 18:44:09 -06:00
James Seibel fde48b6f1a replace stacktrace prints with loggers 2025-01-09 18:43:59 -06:00
James Seibel f2a36e73d0 Fix typo in BatchGenEnvironment 2025-01-09 17:13:03 -06:00
s809 c5429ad139 Ignore task rejections if shutting down 2025-01-08 18:46:22 +05:00
James Seibel 7bc2ee296c Improve auto updater logging and fix potential issues with updating 2025-01-07 21:34:07 -06:00
James Seibel 4e26e4ab31 Add quick config to show/hide world gen progress 2025-01-07 20:30:34 -06:00
James Seibel a91685b590 Fix missing LODs (especially when world gen is active) 2025-01-07 20:14:46 -06:00
James Seibel 06f73c9b0a Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-01-07 20:00:55 -06:00
James Seibel 062dc29fd4 Add world gen progress updates to the overlay 2025-01-07 19:18:30 -06:00
s809 4096a24306 Fix some small issues and add comments 2025-01-07 17:08:28 +05:00
s809 2563de3ba3 Merge branch 'refactor/thread-pool-executors' 2025-01-07 16:36:57 +05:00
s809 4a99b42fa8 Add a config option to force server to always send only the highest detail 2025-01-07 01:25:36 +05:00
s809 f12f119ce2 Refactor thread pool handling 2025-01-06 23:32:29 +05:00
James Seibel 775adfaad5 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2025-01-05 19:15:28 -06:00
James Seibel 2a9c319935 Log a warning if the vanilla render distance is too high 2025-01-05 19:15:18 -06:00
s809 fda44c41a8 Add comments to UPDATE_POS_MANAGER.maxSize and refactor 2025-01-04 22:11:26 +05:00
James Seibel 8247f5f215 add comments to DhLitWorldGenRegion.getBlockTicks() 2025-01-04 10:50:56 -06:00
James Seibel 7eba6848bb Merge branch 'distant-horizons-fix/disable-scheduled-ticks' 2025-01-04 10:17:09 -06:00
James Seibel 6e84cac0d2 Fix infinitely growing memory and add warnings if memory isn't enough 2025-01-04 10:12:03 -06:00
s809 2bf96ea781 Update core 2025-01-04 19:25:48 +05:00
James Seibel d5de4a8171 Fix sqlite memory leaks 2025-01-03 14:47:42 -06:00
James Seibel 3cd7c7f1a3 remove pmcVer from forge runClient 2025-01-03 14:47:18 -06:00
ishland 1741ebf8b2 change: remove block and fluid scheduled tick access as it is unneeded 2025-01-03 16:57:34 +08:00
s809 55776f8beb Update core 2025-01-03 01:04:13 +05:00
s809 a469770e5d Check for updates on launch on dedicated servers 2025-01-03 00:30:15 +05:00
s809 851dabc18b Fix 1.16.5 compilation 2025-01-02 20:20:32 +05:00
s809 dccdbaeb73 Rename serversideShortName to chatCommandName 2025-01-02 19:43:01 +05:00
s809 f4126f5378 Add descriptions to config entries in commands 2025-01-01 20:33:01 +05:00
s809 97af075c7d Use correct world folder name in LAN level key prefix 2025-01-01 18:13:25 +05:00
James Seibel 1dfdd422db Potentially fix EXCEPTION_ACCESS_VIOLATION rendering crash 2024-12-31 09:08:25 -06:00
James Seibel 072082c56a handle corrupted data better 2024-12-28 13:45:43 -06:00
James Seibel 43caa2a55c Fix neoforge running in release 2024-12-28 13:45:17 -06:00
James Seibel b8bad9b6bf fix compiling for MC 1.20.4 2024-12-27 18:12:14 -06:00
James Seibel 8afdd6ed2b Fix typo preventing threadpools from running 2024-12-27 18:11:58 -06:00
James Seibel 34968a6945 Add schedule fix mixin to neoforge
also fix old fabric compiling
2024-12-27 09:25:54 -06:00
James Seibel 851a79a77e Fix compiling on older MC versions 2024-12-27 09:18:00 -06:00
James Seibel 1ca1db705f Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-12-27 08:48:16 -06:00
James Seibel 8f57c2cce2 Only have a single thread config 2024-12-27 08:47:20 -06:00
s809 942e3093cb Respond to incompatible packets so the client is able to display an error in F3 2024-12-27 17:05:07 +05:00
s809 f3e65010f1 Fix failed counter working incorrectly 2024-12-27 15:51:47 +05:00
s809 b3cfb35fac Update core 2024-12-26 16:09:29 +05:00
s809 b60d778303 Use library provided method for filling *ArrayLists 2024-12-25 23:12:58 +05:00
James Seibel 9ec28aa661 Fix beacons not appearing chunks pulled from distant generation 2024-12-25 09:31:01 -06:00
James Seibel 98400a9d3c Fix mod compat warning chat not hiding with config 2024-12-25 09:17:44 -06:00
James Seibel ae8658ae77 Fix DH preventing server shutdown on close 2024-12-25 09:04:55 -06:00
James Seibel e928fe3ecd Fix not loaded tick schedule warning in world gen
"Trying to schedule tick in not loaded position" can log in MC 1.21.4 when sand or other FallingBlock.class blocks attempt to generate in a DH context (IE the chunk isn't loaded in the server).
2024-12-25 08:23:33 -06:00
James Seibel 963dc4a404 minor DhLitWorldGenregion refactor 2024-12-25 08:21:42 -06:00
James Seibel 04f42999df potentially fix rare null pointer 2024-12-24 08:54:28 -06:00
James Seibel 730d014f13 Fix compiling on for MC before 1.21.1 2024-12-24 08:09:02 -06:00
James Seibel 1f81c50ce1 Fix lag/errors when pulling pre-existing chunks 2024-12-24 08:02:01 -06:00
James Seibel f60c550879 Massively reduce memory use and fix object leaks 2024-12-22 09:17:49 -06:00
James Seibel 0d556b5d95 Attempt to fix stuttering in MC 1.21.4 for pre-existing chunk pulling 2024-12-20 15:36:36 -06:00
James Seibel 70d897f09c add config assumePreExistingChunksAreFinished 2024-12-20 15:27:03 -06:00
James Seibel 9accb6d584 refactor testGenericWorldGen to support hotswapping 2024-12-20 14:02:30 -06:00
James Seibel 843dc580c8 Repo and Obj Pool rewrite
This should provide a significant reduction in garbage generated, reducing GC pressure.
2024-12-20 13:38:47 -06:00
James Seibel 77aa4773ef Fix some bugs and reduce GC load slightly 2024-12-14 23:35:36 -06:00
James Seibel fc3c944e3d remove timeout from chunk IoWorker in world gen 2024-12-14 23:35:29 -06:00
James Seibel 7d6aecc4c7 Merge branch 'distant-horizons-feature/server-backed-distant-gen'
Also remove ChunkWrapper LevelReader parameter
2024-12-14 14:07:16 -06:00
James Seibel 528beb8384 Revert chunky core changes 2024-12-14 12:21:56 -06:00
James Seibel 5f1180a5dd Revert "Fix holes when using Chunky" 2024-12-14 12:21:39 -06:00
James Seibel a9f1e8587c Revert "change the chunky warning message"
This reverts commit 77a366065d.
2024-12-14 12:20:27 -06:00
James Seibel 7a076f5509 re-add full (server) distant generator mode 2024-12-13 07:26:55 -06:00
James Seibel 3349e51655 minor batchGenEnv renaming 2024-12-13 07:25:47 -06:00
James Seibel 77a366065d change the chunky warning message 2024-12-12 21:05:19 -06:00
James Seibel c2d6ecaae6 Fix holes when using Chunky
(at the cost of some server lag)
2024-12-12 20:56:48 -06:00
James Seibel c9bc830058 Fix null pointer in LodRenderSection 2024-12-12 07:46:41 -06:00
James Seibel 6125031d9d Remove world gen timeout config
It didn't work as originally intended. It was originally added to prevent world gen lock-ups if a thread hits and infinite loop, but it didn't do anything for that use case and just ended up being annoying for low-end users.
2024-12-12 06:59:10 -06:00
s809 c041cde574 Show thread preset in config entries in server command 2024-12-10 20:19:03 +05:00
s809 bd946af229 Add player into request group before trying to fulfill 2024-12-09 16:48:24 +05:00
s809 559626456a Prune world gen tasks above limit in multiplayer 2024-12-09 12:03:53 +05:00
s809 c6843c1d95 Revert "Fix gen tasks sometimes not submitting after LOD level changes"
This reverts commit 585a288f
2024-12-08 19:33:20 +05:00
James Seibel 0d32fab434 Fix off-by-one error in DhAPI Terrain Repo
Specifically getting by blockpos
2024-12-07 15:08:40 -06:00
James Seibel 94571de00f Improve Chunk LOD building (thanks builderb0y!) 2024-12-07 11:45:02 -06:00
James Seibel d062eff8b4 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-12-07 11:20:28 -06:00
James Seibel b1e46faf6f Fix GLWrapper compiling for MC 1.16 2024-12-07 11:20:09 -06:00
James Seibel 04ed5b2e03 Replace many GL32 calls with GLMC (IMinecraftGLWrapper) 2024-12-07 09:56:50 -06:00
s809 15d9ff503f Re-add pruning of visitedPositions 2024-12-06 23:32:59 +05:00
s809 64942d77e4 Use N-sized generation on server when available 2024-12-06 23:10:53 +05:00
s809 f287dbd4d3 Merge branch 'NSizedMultiplayerTest' 2024-12-04 23:40:00 +05:00
James Seibel c387f57d9c Add MC 1.21.4 to the CI build script 2024-12-03 20:21:10 -06:00
James Seibel 2dacb91b79 Add MC 1.21.4 support 2024-12-03 20:17:50 -06:00
James Seibel d809568cc3 update Iris/Sodium dependency versions for 1.21.1
Just used for compiling and consistency, shouldn't change anything
2024-12-03 19:44:04 -06:00
James Seibel beee44df14 Add fabric-api >= 0.110.1 requirement for MC 1.21.3 2024-12-03 19:40:29 -06:00
s809 f651fc4b50 Up protocol version 2024-12-03 21:23:41 +05:00
s809 596e4eae0e Fix gen tasks sometimes not submitting after LOD level changes 2024-12-03 21:13:01 +05:00
James Seibel 6e70073ae4 Add visited position removal timer in RemoteFullDataSourceProvider 2024-12-02 07:51:12 -06:00
James Seibel 1beef2b4ad Fix a potential null pointer in world gen chunk loading 2024-12-02 07:18:42 -06:00
James Seibel a0e4ed8371 Fix 1.20.4 compiling 2024-12-01 21:06:30 -06:00
James Seibel f40adfd9c6 Merge !70 (Fix invisible gui button in MC 1.21.3) 2024-12-01 17:52:32 -06:00
James Seibel 7fb5e95809 Add Fabric 1.21.3 support
Also fixes:
`Mod was built with a newer version of Loom (1.8.9), you are using Loom (1.7.415)`
2024-12-01 17:43:09 -06:00
James Seibel 03d5cb9289 Fix compiling for Java 8 2024-12-01 17:06:53 -06:00
James Seibel 3b4b4d6b7e Remove unused world gen MixinData thread local 2024-12-01 17:00:22 -06:00
James Seibel b9a97a0fda Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-12-01 15:51:42 -06:00
James Seibel 0dae6942cb Update coreSubProjects 2024-12-01 15:51:27 -06:00
James Seibel 8bb6aeb526 up the manifold version 2024.1.35 -> 37 2024-12-01 15:50:54 -06:00
James Seibel 32ec420248 Merge !68 (Fix slowdown when C2ME is installed)
Thanks ishland for the fix!
2024-12-01 15:50:41 -06:00
s809 1925537da0 Lower log level of out of range warning 2024-11-22 14:54:48 +05:00
James Seibel 3bb4c21fa2 Fix forge compiling for some versions 2024-11-21 19:22:25 -06:00
James Seibel 5b61a98196 Fix race condition when generating terrain extremely quickly 2024-11-21 19:00:57 -06:00
James Seibel 7c6eba983a Fix auto updater attempting to update to "null" 2024-11-19 07:32:54 -06:00
James Seibel 0023ab09ed Fix auto updater not appearing on neoforge 2024-11-19 07:32:27 -06:00
James Seibel c289f5d717 minor format cleanup 2024-11-19 06:58:12 -06:00
watertrainer 6df3ad722c delete done TODO 2024-11-19 11:30:43 +00:00
watertrainer 56f6abd858 ensure clientLevel is loaded, even if player gets redirected (fixes #869) 2024-11-19 11:30:00 +00:00
James Seibel c326e0ba81 Fix a rare error where chunk lighting is set to -1 2024-11-18 07:46:27 -06:00
James Seibel 60b28fcf2e Fix sometimes not loading high-detail LODs when on a server 2024-11-18 07:40:24 -06:00
James Seibel a9ffd3bd3b Forgot to remove all of manifold string gradle 2024-11-18 07:15:33 -06:00
James Seibel bc72e925df Remove manifold string plugin 2024-11-17 08:03:15 -06:00
James Seibel 108df99633 up version number 2.3.0-a -> 2.3.0-b 2024-11-16 22:07:41 -06:00
James Seibel ba245ea266 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-11-16 22:03:48 -06:00
James Seibel ec721ce172 minor build.gradle formatting change 2024-11-16 21:59:28 -06:00
James Seibel 3ad2a95c10 up fabric loader version in 1.21.1 2024-11-16 21:59:15 -06:00
James Seibel e22e241d06 revert accidental change to gradle.properties default version 2024-11-16 21:58:18 -06:00
James Seibel cd70d55b4d comment to remove unused fabricLike gradle references 2024-11-16 21:30:58 -06:00
James Seibel b6c98d3bde Append mod loader to merged jars 2024-11-16 21:25:50 -06:00
s809 5fe605540d Replace Apache's base32 with guava 2024-11-15 09:33:10 +05:00
s809 c232b64f24 Add a comment to #pluginMessageReceived methods 2024-11-14 15:52:46 +05:00
s809 f94b6dbaa5 Replace truncating the hashed seed with encoding it into base32 2024-11-14 15:23:57 +05:00
James Seibel 928bc5df6c Fix setting saturation to 0 crashing the game 2024-11-13 18:26:32 -06:00
James Seibel a5865b3545 Decrease Min mcmeta version from 16 -> 7
should still fix #832
mcmeta files were re-added since forge needs them for certain resource files to load
2024-11-11 07:13:04 -06:00
James Seibel 8f15ab7ccd Revert "Close #832 (remove pack.mcmeta)"
This reverts commit 70550a21a0.
2024-11-11 06:58:15 -06:00
James Seibel 131e4124f3 fix getHashedSeed again from merge 2024-11-09 21:21:21 -06:00
James Seibel ae6333c7b5 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-11-09 21:19:36 -06:00
James Seibel d38c622d9b Fix compiling due to incomplete IDhLevel changes 2024-11-09 21:19:01 -06:00
James Seibel fe625e5b55 Fix ColorUtil impot in ClientLevelWrapper 2024-11-09 21:07:23 -06:00
James Seibel 38a6ad552b Fix height fog 2024-11-09 20:58:59 -06:00
s809 222a008514 Remove seed hash from local & server worlds, and expose DH's level identifier to API 2024-11-09 22:37:05 +05:00
James Seibel 56684bdf4c Fix some render thread tasks not running (causing holes) 2024-11-09 09:53:45 -06:00
James Seibel eb4525c68d Update coreSubProjects 2024-11-09 08:49:23 -06:00
James Seibel 66eb2ed0f9 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-11-09 08:49:05 -06:00
James Seibel 9866842e01 Improve Buffer uploading speed and remove buffer upload thread 2024-11-09 08:48:29 -06:00
coolGi e9487b0481 Updated readme to use the new DH links 2024-11-09 14:40:00 +00:00
James Seibel 82c5aa907b Buffer upload speed test 2024-11-08 07:46:17 -06:00
James Seibel 47b145cb90 up neoforge version 21.3.4 -> 21.3.11 2024-11-07 07:30:46 -06:00
James Seibel ff46b925b2 minor config screen refactoring 2024-11-07 07:30:30 -06:00
James Seibel 8ca7ff5ae0 Fix crashing after server shutdown in serverPlayerDisconnectEvent 2024-11-06 07:08:36 -06:00
James Seibel 70550a21a0 Close #832 (remove pack.mcmeta)
DH doesn't use resource pack files so these files are unnecessary and just cause warnings.
2024-11-06 07:01:55 -06:00
James Seibel 50f911f63c Fix unnecessary logging for JarUtil jarFile getting
Closes #733
2024-11-05 07:32:49 -06:00
James Seibel 4b0dca5823 re-add missing ColorUtil import 2024-11-04 19:34:50 -06:00
James Seibel 0e777f04bc Add hashed seed to server level folders to replace multiverse similarity
Closes !514 and Closes !476
2024-11-04 18:31:04 -06:00
s809 b12f27cc18 Fix Flashback crash on dimension loading 2024-11-03 19:20:20 +05:00
James Seibel 1a66f457af add recalculate heightmap config (disabled by default) 2024-11-02 13:09:03 -05:00
James Seibel b4dca6a1b4 Fix MC_CLIENT.getPlayerCount() null pointer 2024-11-02 13:06:10 -05:00
James Seibel 7759a2f9ea Fix air.isSolid() crash 2024-11-02 13:05:56 -05:00
James Seibel fe9bccb91f add 1.21.3 to nightly builds (still no fabric) 2024-11-02 11:29:55 -05:00
James Seibel fc6fd310f6 use gradle for shared fabric launch config 2024-11-02 11:21:20 -05:00
James Seibel 8be161b381 Add MC 1.21.3 support for Neoforge (no fabric) 2024-11-02 11:21:03 -05:00
James Seibel 8eba8cb40b gradle wrapper 2024-10-30 20:49:22 -05:00
James Seibel 44326344e6 update fabric api dependency for 1.21.1 2024-10-29 20:01:59 -05:00
James Seibel 17b7ee9045 Increase the default render distance 128 -> 256 2024-10-27 16:13:54 -05:00
s809 6a47a2150f Fix too many chunks spam 2024-10-26 00:33:48 +05:00
James Seibel 13728a7540 Closes !825 (Cache arrays used in generic object upload) 2024-10-25 07:40:48 -05:00
James Seibel c51e941413 Fix the update screen logo scaling 2024-10-24 07:07:51 -05:00
James Seibel 2a05c32a2f Fix DH fade corrupting the GL state 2024-10-22 16:28:07 -05:00
James Seibel 353a507914 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-10-22 15:33:16 -05:00
James Seibel f3b73d54f8 Update coreSubProjects 2024-10-22 15:33:13 -05:00
s809 92ed9b8070 Update core 2024-10-22 23:55:50 +05:00
s809 9c3c37bc3e Use earlier event for storing server instance 2024-10-22 23:55:37 +05:00
James Seibel 79fb7c654a Add warning if chunky is installed 2024-10-21 13:27:28 -04:00
James Seibel 520b4e0930 add ClientUtil.argbToInt() 2024-10-21 08:53:26 -04:00
s809 45a07206c9 Update core 2024-10-21 16:43:46 +05:00
s809 ad0b78936a Enable multiplayer in 1.16.5 2024-10-21 16:43:39 +05:00
s809 2babae40de Multiply update queue size by player count 2024-10-20 20:04:35 +05:00
s809 17713a9f93 Make sure data source received from file handler is fully generated before sending to client 2024-10-20 15:15:15 +05:00
s809 48120a4a38 Move commands under /dh, add /dh debug command 2024-10-20 15:14:03 +05:00
s809 69ffd795c9 Split commands into classes 2024-10-20 01:39:16 +05:00
s809 1df5dd5458 Up protocol version 2024-10-18 11:18:34 +05:00
James Seibel b77acaa3b2 Fix javadoc compiling and some Mac lockup issues 2024-10-15 07:47:59 -05:00
s809 d8024ab488 Use version specific caches 2024-10-15 00:33:15 +05:00
James Seibel 064d8b3506 Fix default beacon culling setting 2024-10-14 07:41:13 -05:00
James Seibel 9ca6a2116b Fix Forge compiling 2024-10-14 07:40:24 -05:00
James Seibel 449c87982c Add additional run configurations 2024-10-14 07:12:44 -05:00
James Seibel 7edfc40b9d Split the config file, update the config UI, and remove a few unused configs 2024-10-12 20:39:42 -05:00
James Seibel 9acda97f54 Fix N-sized world gen causing holes when moving 2024-10-12 09:53:46 -05:00
James Seibel 14edd63029 Fix adjacent chunk lighting (thanks CreepermeYT) 2024-10-11 22:14:01 -05:00
James Seibel f3a1235dd3 Fix core standalone jar running (hopefully this doesn't bork Quilt) 2024-10-10 07:44:15 -05:00
James Seibel de93bfee2f Fix 1.16.5 and 1.17 compiling 2024-10-10 06:56:03 -05:00
James Seibel 6eb80ace00 Fix world gen incorrectly returning some data sources to the pool 2024-10-08 20:17:33 -05:00
s809 3ac8d6a8b1 Fix incorrect name of a method 2024-10-08 22:59:00 +05:00
s809 269c8dc4e3 Fix incorrect folder being used without level keys 2024-10-08 22:37:55 +05:00
James Seibel c8173005a7 Decrease vertical quality drop off 2024-10-08 07:51:39 -05:00
James Seibel ed846ea564 merge !67 (Add Mojang Maven repository to fix arm64 MacOS builds) 2024-10-08 07:23:39 -05:00
James Seibel f6a8f5c6b5 Prevent returning out of bounds ColumnArrayView's 2024-10-08 07:07:53 -05:00
s809 3c60a7d842 Fix keyed levels not changing 2024-10-08 09:05:27 +05:00
James Seibel 3c97feeaf8 add comment about spongepowered vanilla gradle versions 2024-10-07 20:16:27 -05:00
James Seibel b2ac91f7db Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-10-07 19:45:37 -05:00
James Seibel 1ebad39fc1 Update the API to allow for N-sized world generation requests
This breaks old world generators
2024-10-07 19:45:33 -05:00
James Seibel 38a2edff06 fix batch gen environment exception name 2024-10-07 18:19:39 -05:00
s809 b2cf38798e Fix unhandled message spam in replay mod 2024-10-06 01:47:51 +05:00
s809 ed83e41f19 Use level key prefixes to in LAN multiplayer 2024-10-06 00:20:07 +05:00
s809 6d52cdba0a Prevent server crash on shutdown 2024-10-05 21:30:01 +05:00
s809 05449c9e86 Decouple beacon beam data handling from render handling, send beacon beams to clients 2024-10-05 14:03:08 +05:00
James Seibel 33ef1297ba Close !66 (add IDhApiLevelWrapper.getDhSaveFolder()) 2024-10-04 07:46:09 -05:00
James Seibel 3b13786990 Improve beacon fade rendering 2024-10-03 20:25:26 -05:00
James Seibel 222d06898e Fix zoom mods breaking DH's fade/near clip plane 2024-10-03 17:25:54 -05:00
James Seibel 4438adad24 Improve fade config, add localization, and add fading to the quality presets 2024-10-03 17:10:56 -05:00
James Seibel 986e474657 Add fading to Forge and Neo, fix fading rain, fix old MC compiling 2024-10-03 07:36:11 -05:00
James Seibel e8288a0df9 Fix fade rendering when DH rendering is disabled 2024-10-02 18:16:46 -05:00
James Seibel 74cab8f4ad replace random noise with Bayer for dithering 2024-10-02 18:08:57 -05:00
James Seibel 5e35572de8 Improve overdraw prevention quality 2024-10-02 07:49:46 -05:00
James Seibel 7e0e02bafc Add dithered DH fading, double pass fading, and fix LOD clouds 2024-10-01 22:02:45 -05:00
James Seibel a301532443 merge core changes 2024-09-30 22:00:06 -05:00
James Seibel 940448f219 Add experimental DH/vanilla fading 2024-09-30 21:59:25 -05:00
James Seibel 8510deb6aa Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons 2024-09-28 15:28:08 -05:00
s809 0d0ba5d3bf Do not sync sections after generation, fix incorrect timestamp fetch pos range calculation 2024-09-29 01:18:04 +05:00
James Seibel 036371dd76 Remove multiverse similarity percent and add IDhApiSaveStructure
Similarity percent should no longer be needed since the server support was added
2024-09-28 14:30:38 -05:00
James Seibel 5aae584ffe Fix F3 menu showing the same level multiple times 2024-09-28 10:22:47 -05:00
James Seibel 201c619915 Add Api world load/unload events and DhApiWorldProxy.get/setReadOnly() 2024-09-28 08:33:30 -05:00
James Seibel 7cd6a3bb79 Add temporary vertical Quality CUSTOM option
This is temporary since it's just for determining what values we want long term and adding full control will over-complicate the config
2024-09-26 22:34:38 -05:00
James Seibel ca36d4797d Add hashCode() to FullDataPointIdMap 2024-09-26 07:42:31 -05:00
James Seibel b5fe3bcbf9 Up manifold version 2024.1.30 -> 2024.1.32 2024-09-25 21:58:08 -05:00
James Seibel e43f9e76f6 Change FullDataSourceDTO checksum/hash logic to hopefully be more consistent 2024-09-25 21:57:54 -05:00
James Seibel b8901c3edd Fix default generic rendering instanced mode 2024-09-25 18:44:47 -05:00
James Seibel d28938f8af fix readme logo filepaths 2024-09-22 17:25:19 -05:00
James Seibel 9f108220f5 Update readme logos 2024-09-22 17:23:41 -05:00
James Seibel ffe53a7196 Add new logos 2024-09-22 17:19:00 -05:00
James Seibel 9e12849107 Allow toggling generic obj instanced rendering via config 2024-09-22 16:32:51 -05:00
s809 0a8c093682 Fix missing testAnnotationProcessor 2024-09-23 01:18:39 +05:00
s809 60056e1654 Merge branch 'feature/lan-support' 2024-09-23 00:46:56 +05:00
s809 11a752a99d Fix dedicated server failing to send packets 2024-09-23 00:43:00 +05:00
s809 68097f61eb LAN multiplayer kinda works 2024-09-23 00:02:57 +05:00
James Seibel 8b514b07dc Move mod compat warnings into AbstractModInit and add WWOO to the list 2024-09-22 08:09:31 -05:00
s809 8e6010bbe5 Abstract away serverside parts of world & level 2024-09-22 03:29:07 +05:00
James Seibel 95eb07ca79 add commented out attempt at relocating Sqlite 2024-09-21 11:47:40 -05:00
James Seibel e6e03e78ea try upping manifold_version 2024.1.30 -> 2023.1.17 again
Please revert if compiler messages don't appear correctly
2024-09-21 11:47:16 -05:00
James Seibel d2c572414c up Sqlite version 3.43.0.0 -> 3.46.1.0 2024-09-21 11:46:42 -05:00
James Seibel d2e0d5b32b relocate org.slf4j to partially fix old XaeroPlus 2024-09-21 11:46:17 -05:00
James Seibel d4ba227a44 Fix config file handler corruption due to reading/writing concurrently 2024-09-20 07:29:41 -05:00
James Seibel caba007899 Add pshsh, to the author list 2024-09-20 07:08:37 -05:00
James Seibel d5cfe9b8e9 Revert Iris 1.8 requirement since it didn't work correctly 2024-09-19 19:59:52 -05:00
James Seibel f1707236fa Replace incompatible Iris<=1.7.4 with <1.8.0 to hopefully reduce confusion 2024-09-19 07:31:14 -05:00
James Seibel c55cbdb69a Mark Oculus 1.7 and lower as incompatible on forge 2024-09-19 07:30:10 -05:00
s809 00b69dcc68 Fix mixin crashes on 1.16.5 2024-09-18 01:06:06 +05:00
s809 cd74e33c54 Bump protocol version because of removed InvalidSectionPosException 2024-09-17 12:41:52 +05:00
s809 3f14e5dfa5 Fix naming of some things and comments 2024-09-17 09:48:15 +05:00
James Seibel 8c9e6ea79a Fix very high file handler jobs and pool some render data sources 2024-09-16 20:36:10 -05:00
James Seibel c71de31f57 Fix a few pre-processors blocked renamings 2024-09-16 19:37:34 -05:00
James Seibel ac869bf06e Up API version 3.0.1 -> 4.0.0 2024-09-15 21:16:24 -05:00
James Seibel 3175bc0439 Up version 2.2.2 -> 2.3.0 2024-09-15 21:16:13 -05:00
James Seibel 23ac6ec957 merge server side and minor refactoring 2024-09-15 21:15:40 -05:00
James Seibel f080a59b41 Add netty leak detection and server/client folder separation 2024-09-11 17:38:02 -05:00
James Seibel 603200ed8b only log git info on startup in dev builds 2024-09-11 17:19:33 -05:00
James Seibel b0774052a0 add default intellij gradle run scripts 2024-09-11 17:12:34 -05:00
James Seibel 7e163ce626 Add ILevelWrapper.getDimensionName() 2024-09-11 07:18:57 -05:00
James Seibel d19654cf15 Remove unneeded ChunkWrapper lighting checks 2024-09-10 07:35:02 -05:00
James Seibel 838d8be08b minor refactoring and style cleanup 2024-09-10 07:29:42 -05:00
James Seibel 2de82b1223 Add Netty to the build script 2024-09-10 06:55:40 -05:00
James Seibel 650012fb08 allow CI/CD to auto retry if there was a system failure 2024-09-10 06:53:06 -05:00
James Seibel a1ef3466ad Add test scripts folder 2024-09-10 06:52:21 -05:00
James Seibel 97421feb33 Add Oculus 1.7 to the list of incompatible fabric mods 2024-09-09 07:43:24 -05:00
James Seibel 0c90af6515 Fix low quality LODs not loading when flying in a new straight line 2024-09-09 07:41:20 -05:00
James Seibel 9cebd0298c add brown mushrooms to the list of ignored blocks to fix swamp issues 2024-09-07 14:22:45 -05:00
James Seibel 9afcddca4f Add faster sky light engine from Builderb0y
Closes !67
2024-09-07 12:07:59 -05:00
James Seibel 02fb7eedba Add missing LightingTestChunkWrapper methods 2024-09-06 21:55:55 -05:00
James Seibel 4aa9bec15c Fix unit test compiling 2024-09-06 19:36:41 -05:00
James Seibel a6eeaa5b3e Closes #805 (Hide "Distant Horizons overloaded")
Also update chunks closest to the player first
2024-09-06 18:23:04 -05:00
James Seibel c462325ce6 Add BuilderB0y's getBlockState optimization 2024-09-05 07:50:25 -05:00
James Seibel d208b0ab19 Up version number 2.2.1 -> 2.2.2-dev 2024-09-04 06:59:07 -05:00
James Seibel ab4ef429db Up version 2.2.1-dev -> 2.2.1 and API 3.0.0 -> 3.0.1 2024-09-04 06:58:28 -05:00
James Seibel 86473e022e Fix referencing unavailable GLFW methods for MC 1.18.2 and lower 2024-09-03 07:03:30 -05:00
James Seibel fd89f569d0 Fix MC 1.17.1 not compiling 2024-09-01 21:16:14 -05:00
James Seibel eefc765823 Fix LODs flashing while moving 2024-09-01 21:10:32 -05:00
James Seibel ebccb2516b Cull beacons based on X/Z distance instead of 3D distance 2024-09-01 17:28:13 -05:00
James Seibel 8c62a40da9 Disable instanced rendering on Mac when Sodium is present
Closes !793 (Generic Rendering crashes with Sodium on M1 Mac)
2024-09-01 17:02:49 -05:00
James Seibel d56af5c38f Fix some beacon rendering/updating issues 2024-09-01 16:36:41 -05:00
James Seibel 39b1ec61ba Fix glass panes not affecting beacon colors 2024-09-01 15:04:27 -05:00
James Seibel cb613cf7df add disableUnchangedChunkCheck config 2024-08-31 22:11:29 -05:00
James Seibel 28e33b4c36 Fix MC 1.16+ compiling 2024-08-31 22:11:14 -05:00
James Seibel 855e6b8180 Update pos getters and remove (hopefully) unneeded imports 2024-08-31 21:57:53 -05:00
James Seibel d62161f529 Fix cloud color not matching MC 2024-08-31 21:56:32 -05:00
James Seibel 71d48411f1 Add DhBlockPosMutable and make the original immutable 2024-08-30 07:36:04 -05:00
James Seibel 731842e09c Fix DH beacon detection logic breaking the lighting engine 2024-08-29 19:54:44 -05:00
James Seibel 61169f87c0 Fix LODs not updating underground 2024-08-29 07:33:21 -05:00
James Seibel 9fb3b196d2 Add a quick DH cloud UI config 2024-08-28 07:16:33 -05:00
James Seibel 867b875cf9 Fix Lithium breaking world gen for MC 1.20.1 and older 2024-08-27 19:19:09 -05:00
James Seibel 3875c8c4ce Up version number 2.2.0 -> 2.2.1-dev 2024-08-20 19:16:28 -05:00
James Seibel 89b959d3f5 Up version number 2.1.3-dev -> 2.2.0 2024-08-20 17:45:42 -05:00
James Seibel d62e50d6f4 Fix Legacy GL causing fog to smear 2024-08-20 17:45:31 -05:00
James Seibel 16836a2b49 Move MixinChunkMap shared code to common 2024-08-18 14:46:49 -05:00
James Seibel f5651f26a5 Merge !65 (fix neo/forge chunk update events) 2024-08-18 14:31:24 -05:00
James Seibel 82ff59c857 Fix fog and SSAO being broken by some mods 2024-08-17 22:29:42 -05:00
James Seibel 8af61041f0 Remove 1.21 from CI build script
1.21.1 also covers 1.21
2024-08-16 17:28:36 -05:00
James Seibel 2a9136b56f Merge 1.21.1 and 1.21 2024-08-15 07:21:19 -05:00
James Seibel 64da6c811d revert temporary 1.17.1 breakage 2024-08-13 17:24:18 -05:00
James Seibel e6b93e0d92 forgot to close test preprocessor 2024-08-13 07:46:49 -05:00
James Seibel f874219a64 Wrong 1.17.1 perpreocessor used 2024-08-13 07:33:39 -05:00
James Seibel b4822740f4 temporarily break 1.17 compiling to test gitlab bages 2024-08-13 07:33:04 -05:00
James Seibel af205a50b4 Deprecate IDhApiWorldGenerator.isBusy(), task queuing is now handled internally 2024-08-12 22:20:14 -05:00
James Seibel 2f6eaf79bd Add optional DhApiChunk validation for world gen 2024-08-12 21:47:58 -05:00
James Seibel 625f1e700f Fix MC 1.21 / 1.21.1 2024-08-12 21:05:15 -05:00
James Seibel 897d5b0b11 Change MC 1.21 -> 1.21.1 in CI version 2024-08-12 19:53:48 -05:00
James Seibel 95641e2f4e Allow adding empty lists to DhApiChunk 2024-08-11 22:01:29 -05:00
James Seibel cd856b86c7 Fix DhApiChunk setDataPoints failing for empty lists 2024-08-11 21:55:19 -05:00
James Seibel c00aa6d627 Add MC 1.21.1 2024-08-11 20:05:24 -05:00
James Seibel 398a3fb0bc Add alex's cave warning message 2024-08-11 09:55:12 -05:00
James Seibel e0fa638ad9 Fix beacons not enabling/disabling correctly 2024-08-09 07:26:20 -05:00
James Seibel 4e42cbd4ce Fix frustum culling when the screen is warped 2024-08-07 18:55:09 -05:00
James Seibel b6c6be77cd Fix beacons not being updated 2024-08-07 07:47:30 -05:00
James Seibel 0964293a72 Fix direct memory leak and remove config for GpuUpload 2024-08-07 07:30:01 -05:00
James Seibel c8b6141ce0 Improve LOD detail level detection and hole filling 2024-08-04 08:31:03 -05:00
James Seibel 948540369f Attempt to improve LOD building speed and reduce broken lighting on servers 2024-08-03 17:11:22 -05:00
James Seibel 363df0ad6f Fix MC 1.16/1.17 compiling 2024-08-03 11:38:02 -05:00
James Seibel a37e105434 Add (disabled) test API world generator 2024-08-03 09:52:06 -05:00
James Seibel aeea0c00c3 Allow DhApiChunk to accept top down or bottom up data point orders 2024-08-03 09:33:05 -05:00
James Seibel 137352674e Fix off by 1 error in Render data transformer 2024-08-02 18:30:59 -05:00
James Seibel 4734552954 Fix MC 1.16 compiling 2024-08-02 18:21:47 -05:00
James Seibel 879c2f1ec4 Fix out of bounds exception in Full Data Transformer 2024-08-02 17:56:33 -05:00
James Seibel 7dc9d2a352 Clean up faster world gen and fix even offset gen events 2024-08-02 08:25:32 -05:00
James Seibel cabc470ebd Temporary Test removing world gen boarder chunks 2024-08-01 07:44:46 -05:00
James Seibel 0bf1f493aa Change some world gen info logs to debug 2024-08-01 07:06:47 -05:00
James Seibel 705bd14ee4 Fix cave culling affecting floating islands and add LOD reload to some configs 2024-07-31 19:06:47 -05:00
James Seibel 155955e49b Mark Iris 1.7.4 and lower as incompatible (as recommended by IMS) 2024-07-30 17:13:54 -05:00
James Seibel c76a793b18 Remove deprecated methods and move method to StringUtil 2024-07-30 17:07:16 -05:00
James Seibel 50cc8501a0 Remove unused sodium and McRenderWrapper methods
Removed methods were originally used to cull LODs if MC had loaded chunks, however this turned out to be more trouble than it was worth and caused more problems than it solved.
2024-07-30 17:01:09 -05:00
James Seibel 209279e3e4 Merge branch 'distant-horizons-m2' 2024-07-30 16:06:39 -05:00
James Seibel 41239572a5 Fix presets only using "custom" after any value was changed 2024-07-30 15:47:52 -05:00
James Seibel 106ab47c3d Fix default logging debug to file 2024-07-29 20:40:54 -05:00
James Seibel a84f9b60e5 Fix rapidly changing dimensions causing the game to crash 2024-07-29 07:29:56 -05:00
James Seibel 4481e8634a Fix incorrect DhApiChunk create constructor parameter order (again) 2024-07-28 20:18:31 -05:00
James Seibel 3e432682fb fix incorrect positions being fed into biome color code 2024-07-28 09:34:15 -05:00
James Seibel 05569c03a4 Revert and Deprecate DhApiChunk and DhApiTerrainDataPoint constructors 2024-07-28 08:56:26 -05:00
James Seibel 2d567b84be Fix holes in LODs boarding different detail levels 2024-07-27 21:06:55 -05:00
James Seibel e2a378250f Fix LOD upload warning 2024-07-27 20:25:58 -05:00
James Seibel e2083a1836 Fix LODs flashing twice when changing configs 2024-07-27 20:11:49 -05:00
James Seibel 334946ab59 Potentially fix thread warnings in ClientBlockStateColorCache 2024-07-27 19:15:00 -05:00
James Seibel 8c9bb98125 Update IDhApiRenderProxy.clearRenderDataCache() to also clear cached block colors 2024-07-27 17:36:57 -05:00
James Seibel 726f0f3d3c Remove unused ServerBlockStateCache 2024-07-27 16:51:14 -05:00
James Seibel 50e5898692 Rename ClientBlockStateCache -> ClientBlockStateColorCache
And do some additional cleanup
2024-07-27 16:44:47 -05:00
James Seibel de05a5f674 Refactor and cleanup ClientBlockStateCache 2024-07-27 16:25:27 -05:00
James Seibel 31b57fae50 fix 1.16.5 compiling 2024-07-27 16:24:31 -05:00
James Seibel 2f686057f3 Fix ice/water vertical LOD lighting 2024-07-27 09:30:51 -05:00
James Seibel 132251341f Fix replay mod not showing LODs 2024-07-21 20:06:40 -05:00
James Seibel 2bac5f933a remove unused clientLevelWrapper.getGameDirectory() 2024-07-21 19:29:01 -05:00
James Seibel 2e565aa83a Improve cave culling and add config for ignored/cave blocks 2024-07-21 17:27:26 -05:00
James Seibel 4e9d0f4861 Fix ConfigEntry String value saving 2024-07-21 16:13:55 -05:00
James Seibel 7216b193e8 Fix API chunk world gen 2024-07-20 17:58:39 -05:00
James Seibel c33a5bf814 Add IDhApiWrapperFactory resourceLocation string methods for block/biomes 2024-07-20 11:21:01 -05:00
James Seibel 97756a5196 Add AbstractDhApiChunkWorldGenerator.generateApiChunk() 2024-07-20 10:45:55 -05:00
James Seibel 377f7d23e3 Remove render param from DhApiAfterRenderEvent 2024-07-14 09:31:03 -05:00
James Seibel 7005202384 Add a optional memory cache to the IDhApiTerrainDataRepo 2024-07-14 08:41:22 -05:00
James Seibel 99e8f57bac add missing genericRendering to IDhApiGraphicsConfig 2024-07-14 07:25:49 -05:00
James Seibel afddf4168e Change some chunk deserialization errors to warnings 2024-07-13 12:59:43 -05:00
James Seibel fbffdc0c9f Fix fog for Mac and remove near fog limitation 2024-07-13 12:17:30 -05:00
James Seibel e6d3647490 Increase default fog start distance 2024-07-13 08:14:33 -05:00
James Seibel 13363ff363 make clouds smaller and thinner 2024-07-12 21:47:16 -05:00
James Seibel 7f98e4b1eb Fix potential chunkWrapper null pointer 2024-07-12 21:31:12 -05:00
James Seibel 408460b0ae Fix missing imports for MC 1.19 and below 2024-07-12 20:31:36 -05:00
James Seibel b69ef5835d Fix repo connections not getting closed 2024-07-12 20:22:02 -05:00
James Seibel 0428fa0912 Clone API event parameters to reduce listener contamination 2024-07-12 19:22:25 -05:00
James Seibel 9f3124fa56 Add renderEventParam to generic rendering shader binding by IMS request 2024-07-12 17:27:32 -05:00
James Seibel fbbdab73c6 Attempt to fix lag spikes when right clicking blocks 2024-07-12 17:24:45 -05:00
James Seibel ee9441c521 Fix world gen not skipping already complete stages 2024-07-12 07:41:18 -05:00
James Seibel a9e0fd5d9b Add generic object setup/cleanup events 2024-07-12 07:16:06 -05:00
James Seibel 98464889ca Fix material typo 2 2024-07-11 22:51:47 -05:00
James Seibel eed5fd60c6 Fix material typo 2024-07-11 22:07:15 -05:00
James Seibel ac43cd5496 Add generic object materials 2024-07-11 18:13:07 -05:00
James Seibel 1f16a7c808 Fix generic rendering and add EDhApiBlockMaterial 2024-07-11 17:58:05 -05:00
James Seibel 39e4c70754 Add api for generic rendering config 2024-07-11 17:39:01 -05:00
James Seibel 82eb27af4c Add DhApiBeforeGenericObjectRenderEvent 2024-07-11 17:32:26 -05:00
IMS212 3aaab94b39 Support both Sodium 0.5 and 0.6 with reflection 2024-07-10 21:02:53 -07:00
James Seibel 07a0779ca4 Fix potential light map crashing and memory leak 2024-07-10 18:57:09 -05:00
James Seibel 2adba02a38 Add "IP Only" to multiplayer tooltip 2024-07-10 07:45:12 -05:00
James Seibel 9dd76db3fc Fix generic rendering at extreme distances 2024-07-10 07:37:18 -05:00
James Seibel 97dacf2429 Add toggleable logging for GL Buffer garbage collection
Will need to be tested by someone who is experiencing issue #718, so far I've been unable to reproduce anything meaningful.
2024-07-09 17:40:27 -05:00
James Seibel 1c189e162a fix sub MC 1.20.1 compiling 2024-07-09 16:39:29 -05:00
James Seibel f7a0fff869 Move IBlockStateWrapper constants into LodUtil 2024-07-09 16:39:04 -05:00
James Seibel 2f985d0926 Add beacon colors 2024-07-09 07:33:30 -05:00
James Seibel 2a3c544fba Increase cloud rendering performance 2024-07-08 19:56:29 -05:00
James Seibel 09d133b994 Add generic rendering localization 2024-07-08 07:45:03 -05:00
James Seibel 26a4223ecf Fix double unloading beacons 2024-07-07 19:54:25 -05:00
James Seibel e2943fdcaf Fix beacons un-rendering when unloading LODs 2024-07-07 19:45:47 -05:00
James Seibel f1053251b4 Add missing generic rendering config options 2024-07-07 18:13:58 -05:00
James Seibel be1dcaf43c Add cloud rendering 2024-07-07 18:03:11 -05:00
James Seibel a899d988fc Fix concurrent modification for GenericObjectRenderer 2024-07-04 21:43:15 -05:00
James Seibel 06b5b2c514 Fix potential null pointer in auto updater 2024-07-04 17:37:30 -05:00
James Seibel 864a19b79f Remove useless IServerLevelWrapper.tryGetClientLevelWrapper() 2024-07-04 16:31:04 -05:00
James Seibel 8974323406 Fix Api client level not containing the generic renderer 2024-07-04 16:15:51 -05:00
James Seibel 46c9e0103a Improve world gen timeout warning message 2024-07-04 16:01:33 -05:00
James Seibel 02203466ed Move generic rendering to the level API 2024-07-03 22:38:14 -05:00
James Seibel 87b22ea1cc Add a config to use pre-existing lighting 2024-07-03 20:30:56 -05:00
James Seibel d26327a930 fix max chunk Y position for empty chunks 2024-07-03 19:14:47 -05:00
James Seibel 469d2bdcb7 Add improved beacon logic 2024-07-02 17:51:26 -05:00
James Seibel 5516603a0c Add temporary proof-of-concept beacon rendering 2024-06-30 18:08:55 -05:00
James Seibel b737adc3da Up API version 2.1.0 -> 3.0.0 2024-06-30 16:36:49 -05:00
James Seibel f3a8afeee3 Up version 2.1.2 -> 2.1.3-dev 2024-06-25 19:25:35 -05:00
James Seibel a4501f86e9 Update coreSubProjects 2024-06-25 19:24:13 -05:00
James Seibel 095fff96ff Up version 2.1.1-dev -> 2.1.2 2024-06-24 20:53:45 -05:00
James Seibel a23211d061 Fix NeoForge not running 2024-06-24 20:52:14 -05:00
James Seibel b57ea41686 neoforge build script cleanup 2024-06-23 08:52:55 -05:00
James Seibel 62fb5ffb73 Add DB file lock checking 2024-06-23 08:36:48 -05:00
James Seibel 99c713967b Temporary spongepowered.vanillagradle fix/workaround 2024-06-22 16:21:19 -05:00
James Seibel 9f3de07bd8 Increase default world gen timeout to 3 minutes (from 60 sec) 2024-06-18 07:12:01 -05:00
James Seibel cd74117de3 Fix file handler tooltip 2024-06-17 07:42:35 -05:00
James Seibel e7d7033548 Improve F3 menu logic and visuals 2024-06-15 19:20:25 -05:00
James Seibel 34db7c9dac Lower the default CPU presets 2024-06-15 11:26:05 -05:00
James Seibel 272841aae9 Add a startup low memory warning 2024-06-15 11:05:10 -05:00
James Seibel 389b09a5cd Prevent creating LODs for already processed chunks 2024-06-15 09:42:49 -05:00
James Seibel 84bd876c71 Refactor ChunkWrapper 2024-06-15 08:11:26 -05:00
James Seibel 7e45051ffd Fix more MC version compiles 2024-06-14 22:21:52 -05:00
James Seibel 5570f3a313 Fix some compiling issues 2024-06-14 19:31:21 -05:00
James Seibel f4e71f7012 Add NeoForge 1.21 2024-06-14 19:05:45 -05:00
James Seibel 601d4e6e3a Fix CI not picking up 1.21 2024-06-14 07:40:29 -05:00
James Seibel a12092c1a1 Add fabric 1.21 support 2024-06-14 07:36:25 -05:00
James Seibel 94ad118c5d Minor memory optimization thanks to littlewolf 2024-06-13 07:30:42 -05:00
James Seibel 48e2978438 Fixes #713 (Forge/Neo level unload events not being called) 2024-06-13 07:15:11 -05:00
James Seibel 96b4c1a9e8 Use existing lighting for pre-generated chunks 2024-06-11 20:22:13 -05:00
James Seibel cc4a69c10c Move shared ChunkWrapper code form Main to Core 2024-06-11 18:35:02 -05:00
James Seibel 7293677ddb Batch Generation Environment refactoring 2024-06-10 21:32:14 -05:00
James Seibel 0f2ff20375 Re-arange ChunkLoader 2024-06-10 21:17:57 -05:00
James Seibel 7706240acb Remove OpenGL multithreading 2024-06-08 12:49:17 -05:00
James Seibel 4cf48fd997 Try changing LZMA preset from 4 -> 3 (faster, less compressed)
won't require any lod regeneration since the decompressor is the same
2024-06-08 11:06:42 -05:00
James Seibel 2708c1ee11 Improve config comment spacing 2024-06-08 08:33:41 -05:00
James Seibel ebb0f6ebad Up the manifold version 2023.1.17 -> 2024.1.15 2024-06-08 08:12:03 -05:00
James Seibel 2c263a2549 Up the API version 2.0.0 -> 2.1.0 2024-06-08 08:11:48 -05:00
James Seibel 955524c632 Remove blendium from the list of suggested fabric mods 2024-06-08 08:11:34 -05:00
James Seibel 564e0d3263 Add update branch config "auto" 2024-06-08 08:11:26 -05:00
James Seibel c533b2e8ea Fix config screen blur on 1.20.6 2024-06-08 07:19:50 -05:00
James Seibel 6073d8122a Up the version number 2.1.0-a -> 2.1.1-a-dev 2024-06-07 17:42:46 -05:00
James Seibel 71ca26bba9 Up the version number 2.0.4-a-dev -> 2.1.0-a 2024-05-30 20:14:04 -05:00
James Seibel 75a51be28c remove unused lightmapBindingIndex in DhApiRenderParam 2024-05-27 17:57:58 -05:00
James Seibel a66e4ba157 Potentially fix memory leaks when rendering is disabled 2024-05-27 17:38:00 -05:00
James Seibel f2b9e428d3 Re-add a missing import to fix compiling 2024-05-21 18:24:30 -05:00
James Seibel 5b2497b9d4 Minor MixinMinecraft reformatting 2024-05-21 17:16:36 -05:00
Yeshi0 e78424def4 typo 2024-05-21 20:58:44 +02:00
Yeshi0 e2c94de6e6 fix blurry text on auto update screen 2024-05-21 20:57:12 +02:00
Yeshi0 daa3caf684 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-05-21 15:12:52 +02:00
James Seibel 5991aa42d9 Revert "Add JVM Downgrader (DH now uses Java version Ω)"
This reverts commit af6dca6e5e.
2024-05-21 07:45:33 -05:00
James Seibel ff6a5aae69 Revert "Set the core to use Java version Ω"
This reverts commit c4a9e7a2a7.
2024-05-21 07:45:25 -05:00
James Seibel 80d9b4540b Fix LZ4 in retail MC 2024-05-21 07:43:45 -05:00
James Seibel 4998991ebe Fix option button in 1.20.6 being on the wrong side 2024-05-21 07:12:04 -05:00
James Seibel 14343569fe Fix neoforge config button position 2024-05-21 06:56:27 -05:00
James Seibel be6cc5ff4e Fix some old MC version compiling 2024-05-20 22:19:04 -05:00
James Seibel 0ad3391bea Put config button hide option only in file 2024-05-20 22:15:45 -05:00
James Seibel 582d998e2e Fix GuiHelper rename for MC 1.19.4 and below 2024-05-20 22:12:09 -05:00
James Seibel c00ee26075 Properly shade libraries when using Java version Ω 2024-05-20 22:10:48 -05:00
James Seibel 4c9f70a52f Merge branch 'main' of gitlab.com:jeseibel/distant-horizons 2024-05-20 22:06:59 -05:00
James Seibel 29481bc123 Fix 1.20.6 config page and config button 2024-05-20 22:06:25 -05:00
Cutiepie e274c9e004 Properly shade libraries when using Java version Ω 2024-05-21 11:53:00 +10:00
Yeshi 73988f0308 Merge branch distant-horizons:main into main 2024-05-20 20:06:23 +00:00
Cutiepie c4a9e7a2a7 Set the core to use Java version Ω 2024-05-21 01:56:33 +10:00
Cutiepie af6dca6e5e Add JVM Downgrader (DH now uses Java version Ω) 2024-05-21 01:26:03 +10:00
Yeshi0 a49720a221 fix gradle.properties typos (it was bothering me) 2024-05-20 17:04:10 +02:00
Yeshi0 12a66e70c9 remove unnecessary references to zstd 2024-05-20 17:01:45 +02:00
James Seibel 00d8aa356b minor ClassicConfigGUI reformat 2024-05-20 07:52:46 -05:00
James Seibel d40d94a565 Add probably broken AT OptionsScreen code
Will probably break 1.20.2 and 1.20.4
2024-05-20 07:52:38 -05:00
James Seibel c1f798793e roll back manifold version to fix mystery compiler issues 2024.1.15 -> 2023.1.17 2024-05-19 21:25:26 -05:00
James Seibel 8fe4ad454c update CI JDK 17 -> 21 2024-05-19 20:31:51 -05:00
James Seibel 17022f2df2 Document GuiHelper args 2024-05-19 14:26:27 -05:00
James Seibel 7fa4bc35f6 remove forge from 1.20.6 to fix CI/CD 2024-05-19 14:16:40 -05:00
James Seibel 85df9c5ef4 Add 1.20.6 to the CI build script 2024-05-18 20:32:33 -05:00
James Seibel 45d4f390a9 Fix a bunch of compiler errors 2024-05-18 20:31:15 -05:00
James Seibel e7b60b7562 Fix neoforge 1.20.6 compiling 2024-05-18 11:14:13 -05:00
James Seibel 2615177907 Fix fabric 1.20.6 compiling 2024-05-18 08:07:48 -05:00
James Seibel a83d7e2a26 Replace DhSectionPos with long's for GC performance
What could possibly go wrong?
2024-05-16 22:15:43 -05:00
James Seibel 8a2182e238 Merge branch 'main' of gitlab.com:jeseibel/distant-horizons 2024-05-15 20:40:11 -05:00
James Seibel d45455092c Replace QuadTree iterator linked list with ArrayDeque
Thanks JustALittleWolf!
2024-05-15 07:36:42 -04:00
James Seibel da18469fd4 Fix resource locations in biome/block wrappers 2024-05-15 07:24:08 -04:00
James Seibel 6b5bae9bee Cache block and biome wrapper deserialization values 2024-05-13 20:26:47 -04:00
James Seibel e29a7786e4 Potentially fix LODs not loading in 2024-05-11 16:23:50 -05:00
James Seibel 55a837ca5e Attempt to prevent thread starvation due to world gen 2024-05-10 22:27:29 -05:00
James Seibel 94cba6cf67 Fix compiling 2024-05-10 17:25:52 -05:00
James Seibel 294685df00 Remove indium recommended dependency
A lot of people were reading fabric's warning as a required dependency
2024-05-10 07:05:40 -05:00
James Seibel 2642b7a9a4 disable sql timeout 2024-05-09 23:22:50 -05:00
James Seibel 45594e4e47 Handle missing/corrupted block/biome ID's in the full data 2024-05-09 19:46:33 -05:00
James Seibel 54cd1a2e48 Fix monoliths due to duplicate IDs 2024-05-09 19:45:50 -05:00
James Seibel a20fb982ec Potential fix for NaN multiverse similarity 2024-05-09 07:35:00 -05:00
James Seibel 184d61e637 Up the API version 1.1.0 -> 2.0.0
There were several breaking changes and I forgot to up the major version number appropriately.
2024-05-04 18:17:10 -05:00
James Seibel 06ea56767f Up manifold version 2024.1.12 -> 2024.1.13 2024-05-04 15:37:20 -05:00
James Seibel 1f6e137759 Fix F3 levels not closing with multiverse 2024-05-04 15:36:51 -05:00
James Seibel c7cf7885ae Fix #670 Remove outdated world gen options from tooltip 2024-05-04 09:48:40 -05:00
James Seibel 8e98444887 Update coreSubProjects 2024-05-04 09:23:02 -05:00
James Seibel 9bfe2e8233 Up 1.20 fabric loader versions 0.14.24/0.15.1 -> 0.15.6 2024-05-04 09:22:44 -05:00
James Seibel 21f4adc769 Minor 1.20.6 preprocessor updates 2024-05-02 17:28:30 -05:00
James Seibel 3b10ca5809 Update arch loom 1.5-snapshot -> 1.6-snapshot 2024-05-02 17:27:04 -05:00
James Seibel 6cc8284747 Start adding 1.20.6 2024-05-01 07:45:23 -05:00
James Seibel 6254f7156f Improve nightly build and migration messages 2024-04-30 21:59:17 -05:00
James Seibel 0fa03701a4 Fix debug wireframes rendering on top of LODs 2024-04-30 21:24:08 -05:00
James Seibel 49125cae47 Remove ZStd compression option
Any ZStd data will be automatically deleted and re-generated
2024-04-30 21:17:54 -05:00
James Seibel 3298857d0c Remove references to FastUtil 8.5.13 2024-04-30 20:30:51 -05:00
James Seibel d939cbeb96 remove unused MixinWorldupgrader files 2024-04-30 19:44:44 -05:00
James Seibel 54d254be73 Fix optifine 1.16 support 2024-04-30 19:44:23 -05:00
James Seibel d433fdea62 Fix white grass/water if the biome is null 2024-04-28 17:35:10 -05:00
James Seibel ffa1c54ff3 Fix warning about BiomeWrapper null level on startup 2024-04-28 16:08:08 -05:00
James Seibel 019ac6dec3 Add corrupt data read handling 2024-04-28 15:52:11 -05:00
James Seibel 08d3da47f4 Fix fastutil relocation issues with world gen 2024-04-27 16:46:22 -05:00
James Seibel 348ac2b734 Closes #638 (optifine not rendering on 1.16 + 1.17) 2024-04-27 13:20:18 -05:00
James Seibel fe014b4985 revert b1c6a5c1 2024-04-27 12:56:20 -05:00
James Seibel b7f6f3b900 Remove (hopefully) unused MixinThreadingDetector 2024-04-27 11:55:27 -05:00
James Seibel 3c76ed71d8 Fix some lib shading issues 2024-04-27 11:35:16 -05:00
James Seibel 5de1998913 up the version number 2.0.3 -> 2.0.4 2024-04-26 07:33:48 -05:00
James Seibel 05c0f030cb Fix issues with compressors not appearing at runtime 2024-04-26 07:33:26 -05:00
James Seibel bd85329589 Merge Data_source_rewrite into main 2024-04-26 07:22:03 -05:00
James Seibel da0f4ae326 shade in apache.logging for the standalone jar 2024-04-25 22:09:56 -05:00
James Seibel b37e568372 Change Initializer compressor test class 2024-04-25 21:52:56 -05:00
James Seibel b1c6a5c1d4 Move most libraries from the main script to core 2024-04-25 21:52:04 -05:00
James Seibel 8222126e8f minor MixinMinecraft reformat 2024-04-25 21:34:39 -05:00
James Seibel b5b888c69f Remove duplicate remapJar in fabric gradle 2024-04-25 21:10:05 -05:00
James Seibel 85f6b8320b Fix Fabric compiling 2024-04-25 21:09:42 -05:00
James Seibel 6c4740e8aa Remove Unimined and restore Architectury build system 2024-04-24 22:05:59 -05:00
Cutiepie ffda83c25d Add core to gradle 2024-04-22 18:53:32 +10:00
James Seibel 18859d22a8 Fix getChunk null assertion 2024-04-20 15:36:42 -05:00
James Seibel befa3b375e Fix compiling 2024-04-20 12:36:33 -05:00
James Seibel a96c08cad4 Clean up DhLitWorldGenRegion 2024-04-20 12:16:33 -05:00
James Seibel d7f789c402 Fix fastutil shading
fastutil is already in MC and used by some world gen so shading it causes issues.
2024-04-20 11:23:47 -05:00
James Seibel ed28bcd0ba fix forge issues with already deleted lib folders 2024-04-18 21:07:09 -05:00
James Seibel 982ae0c0a0 speed up initial LOD loading 2024-04-18 21:06:32 -05:00
James Seibel d17897f276 Fix transparent blocks glowing (thanks IMS) 2024-04-18 07:47:47 -05:00
James Seibel c0ccef7e82 Fix common complaining about missing "prepareWorkspace" task 2024-04-16 07:32:21 -05:00
James Seibel 55e5c64c68 update manifold 2024.1.0 -> 2024.1.9 2024-04-14 21:17:15 -05:00
James Seibel da72f783ed minor forge modinfo fix 2024-04-14 21:17:02 -05:00
James Seibel 8a9bfa3d33 fix unnecessary issues with javax and jetbrain compile time annotations 2024-04-14 21:16:50 -05:00
James Seibel 82937d840a Merge branch 'removeArch' into Data_Source_Rewrite 2024-04-14 16:41:28 -05:00
James Seibel c1bd358502 fix fastutil not being relocated 2024-04-13 21:24:58 -05:00
James Seibel a8a22fd9fe Fix Iris incompatibility check for 1.20.4 and add for 1.20.2 and lower 2024-04-13 21:15:37 -05:00
James Seibel adb70857fe Fix migration messages 2024-04-13 17:53:32 -05:00
James Seibel a680596b3e log migration status in F3 menu and chat 2024-04-13 14:25:34 -05:00
James Seibel b2986ec782 Fix fabric unnecessarily unloading levels when respawning 2024-04-13 13:35:22 -05:00
James Seibel f40f7afab3 speed up initial loading when DB migration is necessary 2024-04-13 12:14:59 -05:00
James Seibel 59555d1ca8 Update coreSubProjects 2024-04-13 11:19:11 -05:00
cola98765 6e2eb7d1ac I may be dumb 2024-04-10 13:42:15 +00:00
cola98765 69483067b4 Made leaves color like if they are in fancy setting. Still no config, but with all other changes to colors this might fit better. 2024-04-10 13:40:32 +00:00
James Seibel c815591565 Fix Z-fighting at very high heights 2024-04-10 07:11:30 -05:00
James Seibel f82b7ec608 Improve file handler speed 2024-04-09 07:48:39 -05:00
James Seibel 23a107682c Mark Iris 1.7.0 and older as incompatible 2024-04-08 07:23:49 -05:00
James Seibel 26da69c875 Remove deprecated DhApiScreenResizeEvent 2024-04-08 07:17:30 -05:00
James Seibel 8f2df2396d Improve grass side rendering and add a config 2024-04-07 21:42:39 -05:00
James Seibel dbc9cbb418 Have grass fade to dirt for walls 2024-04-06 12:37:44 -05:00
James Seibel 09c788e495 Fix removed Screen imports 2024-04-06 10:28:50 -05:00
James Seibel 9af71ac0ea Fix API enums missing "DhApi" prefix and remove unused Enums/code 2024-04-06 10:06:09 -05:00
James Seibel 2db20f8f24 Add Sqlite Write Ahead Log to Sqlite 2024-04-06 09:53:34 -05:00
James Seibel 2c9827c227 Merge branch 'distant-horizons-main' into Data_Source_Rewrite 2024-04-06 08:54:19 -05:00
James Seibel 825b1ab4db Re-add a couple readme breakpoints and remove a unneeded note 2024-04-06 08:51:06 -05:00
James Seibel c61faac06c Merge branch 'distant-horizons-main' into Data_Source_Rewrite 2024-04-06 08:46:59 -05:00
James Seibel 6b442f03c1 Update ELodShading names and descriptions 2024-04-06 08:46:47 -05:00
James Seibel 10ab638643 Change Sqlite Journaling to WAL to potentially improve concurrent performance 2024-04-04 07:50:21 -05:00
James Seibel d349d0c453 Make rendering speed worse but improve LOD loading speed 2024-04-04 07:09:56 -05:00
James Seibel e5c948ce9c Improve initial LOD loading speed 2024-04-03 22:07:29 -05:00
James Seibel c51255f379 Add fastutil to gradle (specifically to fix MC 1.16) 2024-04-03 07:43:12 -05:00
James Seibel 5bbeceee56 Add data source pooling 2024-04-01 20:28:38 -05:00
cola98765 ee78920a88 Merge branch 'fix_glass_transparency' into 'Data_Source_Rewrite'
Rework to "calculateColorFromTexture"

See merge request jeseibel/distant-horizons!55
2024-03-29 14:54:06 +00:00
cola98765 138972cf18 Rework to "calculateColorFromTexture" 2024-03-29 14:54:06 +00:00
James Seibel 1bda767cd7 Add Cola's RenderDataTransformer fixes 2024-03-28 17:14:56 -05:00
James Seibel cf1402edb9 Remove the DhRenderData DB table 2024-03-28 07:47:17 -05:00
James Seibel 778144a553 Add WorldCompressionMode config, default to VISUALLY_EQUAL 2024-03-28 07:43:32 -05:00
James Seibel fcca51a8d9 Fix missing indium messy crash error when java.awt is headless 2024-03-24 11:53:46 -05:00
James Seibel 3cc663ee95 remove render data file handling 2024-03-23 18:09:10 -05:00
James Seibel 52f15a86fd add todo about error in ClientBlockStateCache 2024-03-23 17:56:29 -05:00
James Seibel 734bb4afb8 minor biome/block wrapper changes 2024-03-23 16:23:40 -05:00
James Seibel 9cd48fb5d7 Comment out trace logs
These logs aren't printed and will just increase GC pressure for strings
2024-03-23 16:18:40 -05:00
James Seibel cd5c3d9f13 Compress the column gen step in the database 2024-03-20 07:25:42 -05:00
James Seibel 73ba1c8b56 Fix transactionScript auto update variable flipped 2024-03-19 21:10:31 -05:00
James Seibel 8199b4408a Reduce string concatenations in assertions 2024-03-19 20:53:15 -05:00
James Seibel c00e3d7393 Change the SQLite journal mode DELETE -> TRUNCATE 2024-03-19 20:07:35 -05:00
James Seibel 5d60251da0 Cache the blockState and biome wrapper hashCodes 2024-03-19 17:36:22 -05:00
Yeshi 855d707b3e readme improvements 2024-03-19 18:55:05 +01:00
James Seibel 592a1c3601 up the version number 2.0.2 -> 2.0.3 2024-03-19 06:48:31 -05:00
James Seibel da280db0f8 Fix lighting in superflat worlds 2024-03-18 21:28:27 -05:00
James Seibel 0ee6673e68 update todo comments 2024-03-17 16:15:27 -05:00
James Seibel 8bedb3dbaa Remove Seamless Overdraw Test
The result wasn't very good due to rendering issues with entities
2024-03-16 21:03:27 -05:00
James Seibel ea0e24b430 Add multiple compression options and unit tests 2024-03-16 17:25:29 -05:00
Tatounee cd35461df6 Fix cd command in compiling instructions 2024-03-10 02:38:31 +01:00
James Seibel 40580e81c2 Fix ChunkWrapper returning block light 15 for out of bound positions
Now it will return 0, which is more accurate
2024-03-03 14:54:11 -06:00
James Seibel 1a279b90be rename ThreadPools -> ThreadPoolUtil 2024-03-03 14:53:40 -06:00
James Seibel e34203fe3d Fix potential null pointer in BiomeWrapper 2024-03-02 11:45:14 -06:00
James Seibel 870c0f68d3 temporary multiverse null pointer fix 2024-02-22 07:05:21 -06:00
coolGi 004059dd9f Removed mixins from neoforge's mods.toml 2024-02-22 22:10:34 +10:30
coolGi 4290cdf8c6 Changed run dir to the root of the project 2024-02-20 00:51:41 +10:30
coolGi 4d038fc5e6 Fixed up AT 2024-02-20 00:51:25 +10:30
coolGi 0146d62c2a Moved AT to only appear in final build, not in the source code 2024-02-19 23:44:53 +10:30
coolGi 4e6255dc2b Re-added jank file deleting again for now 2024-02-18 21:38:20 +10:30
coolGi 4d73c3ecb8 Moved common to Unimined 2024-02-18 21:09:00 +10:30
coolGi d0dc3ec9bc Added the new unimined flag to fix fabric's access wideners 2024-02-18 20:11:15 +10:30
coolGi ee922236a0 Fixed forge version in readme for this branch 2024-02-18 19:13:20 +10:30
coolGi bf088ab29c Merge branch 'main' into removeArch 2024-02-18 19:11:47 +10:30
coolGi 40102521a1 Updated readme with new mc version 2024-02-18 19:09:54 +10:30
coolGi eb491144f3 Refactored logos into assets/distanthorizons 2024-02-18 19:04:29 +10:30
coolGi a14748ac75 Fixed most of the remaining issues 2024-02-18 18:42:44 +10:30
coolGi 0c5f38a00b Removed un-needed stuff 2024-02-18 16:07:51 +10:30
James Seibel feb6dd41b7 Merge branch 'removeArch' of gitlab.com:jeseibel/distant-horizons into removeArch 2024-02-17 22:37:10 -06:00
James Seibel a093524939 Fix Forge 1.20.4 gradle run 2024-02-17 22:34:18 -06:00
James Seibel 5cc7bebbe5 Update forge 1.20.4 49.0.16 -> 49.0.30 2024-02-17 22:34:06 -06:00
coolGi 32a256619f Fixed using wrong implementation for joml 2024-02-18 14:00:34 +10:30
coolGi f93e648f69 Added a small error if the user forgot to clone the sub-project, and some extra comments 2024-02-18 13:43:11 +10:30
coolGi 41f022df99 Merge branch 'main' into removeArch
# Conflicts:
#	build.gradle
2024-02-18 12:01:02 +10:30
coolGi c84aac7e45 Fixed resources in forge 2024-02-18 11:59:02 +10:30
James Seibel 4e4fbbe48c Merge branch 'main' into removeArch 2024-02-17 09:25:34 -06:00
James Seibel 7265e2b631 add chunk read timeout config and remove duplicate RegionFileStorageExternalCache 2024-02-16 20:04:46 -06:00
James Seibel 0a11f310cf Revert Fog near end/far start distance to pre-RenderUtil fix 2024-02-15 21:54:33 -06:00
James Seibel a6143780fa Fix C2ME file loading 2024-02-15 21:45:11 -06:00
James Seibel 761f802ced Fix fog rendering 2024-02-15 20:36:41 -06:00
James Seibel 2e7cc9f4b6 Temp fix for near clip plane going too far in some cases 2024-02-13 07:53:08 -06:00
James Seibel 4e6e727799 Fix ocean floors showing at very low detail levels
Partially fixes #632
2024-02-11 21:32:08 -06:00
James Seibel 2da444d03c Fix BiomeWrapper warning about null level on startup 2024-02-11 20:24:36 -06:00
James Seibel f4f234a159 Fix NeverCullFrustum casting error 2024-02-11 18:29:51 -06:00
James Seibel e87823aa29 Close #615 (lag when rapidly breaking/placing blocks) 2024-02-11 16:39:29 -06:00
James Seibel 56167a137e Default to no culling for the shadow pass 2024-02-11 14:56:16 -06:00
James Seibel 91ac4309df Fix the API seeing the wrong far clip plane 2024-02-10 22:02:19 -06:00
James Seibel 8a5bca3136 Fix using the wrong near clip plane 2024-02-10 21:58:24 -06:00
James Seibel ec8d1b5538 Fix Lava Iris block material ID 2024-02-10 21:38:55 -06:00
James Seibel 0ebe8db268 Add IDhApiShadowCullingFrustum and a config for shadow culling 2024-02-10 21:38:44 -06:00
coolGi 3bba08723f joml is included in vanilla 1.19.4 2024-02-08 10:28:33 +00:00
coolGi 6a6a87a3f7 Fixed joml being embedded on versions where mc already embeds it 2024-02-08 17:47:13 +10:30
James Seibel 0ccdcfbb6d Fix 1.20.4 compling 2024-02-07 18:19:41 -06:00
James Seibel aa084c885d Attempt to reduce queuing duplicate world gen tasks 2024-02-07 07:34:49 -06:00
coolGi e3a8a7782e Merge branch 'main' into removeArch
# Conflicts:
#	build.gradle
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java
#	forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java
2024-02-07 23:44:24 +10:30
James Seibel c578ae0fa4 Add Lod Shading to the api config 2024-02-07 07:06:39 -06:00
coolGi f17bc1eccd Fixed JOML not being shadowed (not being included in the jar) 2024-02-07 23:32:33 +10:30
coolGi 08c31e5999 Fixed mod auto-updating on quilt 2024-02-07 23:23:15 +10:30
James Seibel dd341c9a22 Add frustum culling config control to the API 2024-02-06 21:45:12 -06:00
James Seibel 733fb8e871 Merge branch 'minecraft-lod-mod-shadow.frustum.culling' 2024-02-06 19:23:56 -06:00
James Seibel 4764f0969a Fix assertion errors in the end 2024-02-06 17:49:08 -06:00
James Seibel 41f8c8cfa4 Fix compiling on MC 1.19.2 and below 2024-02-06 07:17:43 -06:00
James Seibel 42bcc28d3e Merge branch 'minecraft-lod-mod-frustum.culling' 2024-02-05 21:38:46 -06:00
James Seibel b878faac96 Improve StepFeatures logging 2024-02-05 20:31:05 -06:00
James Seibel 32c1cc29f8 Fix Render Buffer count F3 menu not closing 2024-02-05 19:21:52 -06:00
James Seibel 838d82589b Fix Forge 1.20.4 compiling, but not gradle running 2024-02-04 21:27:22 -06:00
James Seibel b62af66f4b rename shadowMe ->shadowCore and shade ->shadowMc 2024-02-04 16:30:25 -06:00
James Seibel 794f524ae3 gradle commenting and minor refactoring 2024-02-04 15:52:27 -06:00
Cutiepie a38551b3d0 Disable tests for modloader projects 2024-02-04 13:28:52 +11:00
James Seibel 03c4926b09 update to latest core 2024-02-03 19:45:29 -06:00
James Seibel 982bf951e1 Fix 1.19.2 compiling 2024-02-01 07:39:16 -06:00
James Seibel a887e35285 Add Iris API events 2024-01-31 21:49:59 -06:00
Cutiepie 172f2b088d Attempt to move over to Unimined 2024-01-30 17:45:47 +11:00
Cutiepie 6d7b557c36 Attempt to move over to Unimined 2024-01-30 17:44:50 +11:00
James Seibel 9959ebc196 Merge branch 'distant-horizons-fixes' 2024-01-27 13:37:50 -06:00
James Seibel d868b8fc72 Fix missing imports 2024-01-27 13:32:35 -06:00
IMS212 297c8a1a1e Actually fix 1.16 2024-01-23 07:47:43 -08:00
IMS212 e809429a8c Fix 1.16 support 2024-01-22 17:59:59 -08:00
IMS212 200ad05f4c Fix suspicious frame time code 2024-01-22 17:52:51 -08:00
IMS212 9b4276c29b Add mushroom 2024-01-22 08:49:00 -08:00
IMS212 038073d34d Minor fixes for translucency and block ID's 2024-01-22 08:37:27 -08:00
James Seibel 8d32ab9bdb Fix method names in neoForge mixinLevelRenderer 2024-01-21 21:48:06 -06:00
James Seibel 9390b8bc4d Fix several Block materials 2024-01-21 21:36:12 -06:00
James Seibel 0d165860fb Merge branch 'distant-horizons-main' 2024-01-21 19:24:42 -06:00
James Seibel 4135fa6211 Update coreSubProjects 2024-01-20 12:24:10 -06:00
James Seibel 1d89467022 Fix Forge 1.20.1 launching (although crashes due to shadowJar fail) 2024-01-20 11:12:08 -06:00
coolGi e21ac626b3 Merge remote-tracking branch 'origin/main' 2024-01-18 19:47:23 +10:30
James Seibel aa73a30ac4 Fix C2ME throwing errors when attempting to get region file 2024-01-17 20:57:10 -06:00
Cutiepie 9a8f14c7d3 Attempt to remove arch and add AWToAt.java 2024-01-17 23:47:58 +06:00
James Seibel d7618d73c3 Fixes #613 (multiplayer failing due to folder not existing) 2024-01-17 07:45:08 -06:00
James Seibel 5aca47b357 Fix render data holes on world gen 2024-01-17 07:15:47 -06:00
coolGi 666ab1319b Fixed 1.17.1 2024-01-17 17:24:52 +10:30
coolGi 50663edc76 Fixed compilation for pre 1.19.4 2024-01-16 17:28:42 +10:30
James Seibel 1fbc37f8e7 Initializer code reduction and reformatting 2024-01-14 16:55:55 -06:00
James Seibel 5f437f8a4e Merge branch 'minecraft-lod-mod-refactor/initialization' 2024-01-14 16:10:40 -06:00
James Seibel 6130c65c48 Add messages to chunk loading about world optimization 2024-01-14 15:53:21 -06:00
James Seibel 1e19dfd6e8 minor lightMapWrapper reformat 2024-01-14 15:08:29 -06:00
James Seibel f866243d5c Attempt to fix File handler repo closed issues 2024-01-14 15:07:35 -06:00
James Seibel af04c6d995 Fix light engine out of bounds for MC 1.16 and 1.17 2024-01-14 13:27:14 -06:00
James Seibel 46bf8d0188 Update coreSubProjects 2024-01-13 23:12:19 -06:00
coolGi fc62c78136 Updated core sub-module 2024-01-13 16:19:54 +10:30
coolGi 93c2bf530f Fixed neoforge crash with merged jar 2024-01-13 16:19:10 +10:30
James Seibel 51b543a23e Fix Optifine not running in dev environment
For some reason loading the net.minecraft.client.ClientBrandRetriever class causes mixin issues
2024-01-12 07:50:49 -06:00
James Seibel dab5373231 Fix Bclib sometimes refusing to download in 1.20.1 2024-01-11 22:13:11 -06:00
coolGi 17f274a7b4 Renamed many neoforged stuff to neoforge (removed "d" at the end) 2024-01-09 19:26:00 +10:30
coolGi 841e5ba492 Fixed neoforge and updated some dependencies 2024-01-09 19:12:26 +10:30
s809 50339c94e7 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into refactor/initialization 2024-01-08 14:52:26 +05:00
James Seibel d2ad35ad05 Overhaul file handlers 2024-01-07 16:06:09 -06:00
James Seibel 0d65578e6a Fix chunk break/place events not triggering fabric updates post MC 1.17 2024-01-07 15:00:53 -06:00
s809 526df4f184 Refactor initializer code 2024-01-07 21:50:50 +05:00
coolGi aa6cbd1b7d Renamed forge classes to neoforge 2023-12-25 18:50:24 +10:30
coolGi 92f0703723 Removed depricated neoforged code 2023-12-25 18:48:18 +10:30
James Seibel 064241333b Merge branch 'fix-url' into 'main'
Fix clone URL

See merge request jeseibel/distant-horizons!47
2023-12-24 15:17:55 +00:00
Rózsa Péter 39b77c783b Fix clone URL 2023-12-24 13:47:11 +00:00
coolGi 0c8717a0da Fixed implNote in JavaDocs (as it "technically" part of the official Java standard) 2023-12-24 21:42:17 +10:30
coolGi 7f89a1a2cc Fixed 1.16.5 & 1.17.1 compilation 2023-12-24 21:32:21 +10:30
coolGi 5f16f81d58 Merged jar, now for fabric (works on quilt as well), forge and neoforged 2023-12-24 21:16:10 +10:30
coolGi 10bbcc79d3 Re-added forge to 1.20.4 build properties 2023-12-24 19:39:22 +10:30
coolGi ffc9771b17 Renamed forge stuff in neoforged to neoforged 2023-12-24 19:25:57 +10:30
coolGi 091b115aad Added neoforged to the ci 2023-12-23 15:31:41 +10:30
coolGi c3bdc22e28 NeoForged for 1.20.4! 2023-12-23 05:31:02 +10:30
coolGi 28d4cc86a9 Fixed 1.20.4 forge remap 2023-12-23 04:07:44 +10:30
James Seibel bb6e29f254 Merge Builderb0y API world gen extension 2023-12-22 07:19:26 -06:00
James Seibel ea0d4ba7d8 Potential fix for world gen lockup if files system fails 2023-12-20 22:06:08 -06:00
James Seibel 0504882afd Fix ocean lighting grid issue 2023-12-20 07:45:21 -06:00
James Seibel 0156f03e91 Update coreSubProjects 2023-12-19 07:38:55 -06:00
James Seibel d2acaba5c7 Add IDhApiWrapperFactory 2023-12-16 15:49:53 -06:00
James Seibel 60e4128316 Add DhApi.isDhThread() 2023-12-16 09:50:41 -06:00
James Seibel dc8aa7624b Update coreSubProjects 2023-12-16 09:09:46 -06:00
James Seibel 941aeedee0 Merge branch 'chisels' 2023-12-15 07:12:07 -06:00
James Seibel 4d8ce3b5ea Optimize DH lighting for chunks with populated sections
Specifically improves lighting speed for BigGlobe worlds
2023-12-14 07:50:57 -06:00
James Seibel 6044d24a48 Fix ThreadPool null pointer before world startup 2023-12-13 22:08:45 -06:00
James Seibel d597634ac6 Fix forge 1.20.4 crashing due to incorrect version number order 2023-12-12 07:47:22 -06:00
coolGi cf8b0329bb Hopefully fixed compolation with the new preprocessor 2023-12-12 22:17:21 +10:30
coolGi 24520824e9 Updated to new git url 2023-12-12 19:28:45 +10:30
coolGi 0d7b0f9fe4 Updated to new git url 2023-12-12 19:28:41 +10:30
coolGi 61460f9ac0 Updated java files to use version numbers 2023-12-12 19:23:28 +10:30
coolGi 14d64d535a Changed preprocessor to use version numbers 2023-12-12 18:11:26 +10:30
coolGi b00c252f17 Updated gradle (and its wrapper), and fabric and architectury loom 2023-12-12 17:56:44 +10:30
Pierre Remacle 0fe017df74 Chisels & Bits blocks transparent 2023-12-11 16:05:03 +01:00
James Seibel 4ae7083dcf Update coreSubProjects 2023-12-11 07:46:53 -06:00
James Seibel 7d5357dec8 downgrade 1.17.1 bclib 0.5.6 -> 0.5.5
For some reason my machine refused to download 0.5.6, anyone can re-update to the latest if the issue becomes resolved
2023-12-11 07:46:50 -06:00
James Seibel 2bb2f5a233 Remove PRE and POST preprocessor MC versions 2023-12-11 07:45:54 -06:00
James Seibel fee1c98a34 Fix 595 (crash on save and exit) 2023-12-09 16:19:05 -06:00
James Seibel e787d7d317 Attempt to fix a rare concurrent lighting engine issue with ChunkWrapper.getBlockLightPosList() 2023-12-09 16:18:17 -06:00
James Seibel ed52efa72b Fix SSAO and Fog not applying when Optifine shaders are enabled 2023-12-09 10:05:17 -06:00
James Seibel 963d22b2f5 Add a potential fix to unconfigured C2ME crashing/log spam 2023-12-09 09:42:18 -06:00
coolGi 8714be1dc7 Updated ci to include 1.20.4 2023-12-09 14:47:19 +10:30
coolGi 04ddd83519 Fixed up screens looking incorrect on 1.20.4 mc versions 2023-12-09 14:41:15 +10:30
coolGi 5b81ca2716 Updated to 1.20.3/4 2023-12-09 14:09:24 +10:30
James Seibel 6f8c7e8249 Add Config API methods getApiValue() and clearValue() 2023-12-07 07:13:43 -06:00
James Seibel fabad7158e Up the api version number 1.0.0 -> 1.1.0 2023-12-06 07:50:23 -06:00
James Seibel bae7e44dd8 Add overdraw number input 2023-12-06 07:50:10 -06:00
James Seibel 926c7924df Merge in Builderb0y's render merging improvements 2023-12-05 07:15:39 -06:00
James Seibel 704a2ff217 Only display empty biomeWrapper string logs once 2023-12-04 07:17:51 -06:00
coolGi 871c6031b8 Added version number to updated jar 2023-12-04 23:34:40 +10:30
James Seibel afb0a57920 up the version number 2.0.1-a -> 2.0.2-a 2023-12-03 19:13:19 -06:00
James Seibel 1787d2c6d9 Fix BlockStateWrapper compiling 2023-12-03 18:38:17 -06:00
James Seibel 1a07fb83b6 Revert Sqlite update 3.44.1.0 -> 3.43.0.0
The new version caused java module issues. I'll have to look into it again another time.
2023-12-03 17:55:01 -06:00
James Seibel 4d2ee292bb Remove "-dev" from the version number 2023-12-03 17:19:30 -06:00
James Seibel 0fdde61fe5 Add a config to enable/disable using MC's lighting engine 2023-12-02 12:37:30 -06:00
James Seibel ae8a4912a6 Add a limit to the number of queued update chunks 2023-12-02 12:24:22 -06:00
James Seibel ffd8ea8751 Fix snow light rendering 2023-12-02 12:07:35 -06:00
James Seibel 4cd10a82fd Fix DH lighting failing for water 2023-12-01 07:50:14 -06:00
James Seibel 4955d22649 Fix block lighting being ignored in MC 1.20.2 2023-12-01 07:49:36 -06:00
James Seibel 425b761f8e Fix pack.mcmeta typo 2023-11-30 07:37:13 -06:00
James Seibel ab3bfd457f Merge branch 'Lorenzo_Giannini-main-patch-20902' into 'main'
multiversion vanilla support

See merge request jeseibel/distant-horizons!43
2023-11-30 13:30:46 +00:00
James Seibel 0faa64112a Refactor, comment, and rename 2023-11-30 07:25:57 -06:00
James Seibel 46519b096c Merge branch 'distant-horizons-lightmapfix' 2023-11-30 07:08:46 -06:00
James Seibel cb7d980e15 Fix a typo in the bug issue template 2023-11-30 07:03:15 -06:00
James Seibel 6c1562ac33 Merge Null's fragment shader culling !38 2023-11-29 07:44:27 -06:00
James Seibel 5e17e4ea8c Update Sqlite 3.43.0.0 -> =3.44.1.0 2023-11-28 07:13:44 -06:00
Fourmisain b8e7b14fbb fix light map update being done on non-light-map textures 2023-11-27 16:58:54 +01:00
James Seibel 5d8eb185bc Merge branch 'Lorenzo_Giannini-main-patch-41483' into 'main'
fix links

See merge request jeseibel/distant-horizons!42
2023-11-25 21:08:43 +00:00
Lorenzo Giannini 7325cedba6 Update pack.mcmeta 2023-11-25 18:31:10 +00:00
Lorenzo Giannini e5043d6d9b fix links 2023-11-25 18:21:21 +00:00
James Seibel 13e53a18e3 Change the default MC version from 1.20.1 -> 1.20.2 2023-11-25 12:13:18 -06:00
James Seibel dd60c7620f Fix null pointer when joining some multiverse servers 2023-11-25 11:39:53 -06:00
James Seibel 83c01cabfb Fix lighting on some servers 2023-11-25 11:08:44 -06:00
James Seibel a95171dbbe Add constants to BlockStateWrapper 2023-11-25 08:46:03 -06:00
James Seibel 10d542ed14 Fix incorrect ChunkWrapper IndexOutOfBounds checking 2023-11-25 08:45:23 -06:00
James Seibel 7e1c55a0c5 Fix merging for transparent LODs over the void 2023-11-24 14:02:33 -06:00
James Seibel 4e25d318ec Fix a potential concurrent error on DhClientServerWorld shutdown 2023-11-24 09:46:51 -06:00
James Seibel c4228f4e63 Improve multiverse similarity logic and fix incorrect log 2023-11-21 07:44:28 -06:00
James Seibel 1411091f60 Fix null pointers when moving between multiverse levels 2023-11-20 07:35:26 -06:00
coolGi 6a2278949e Updated core submodule 2023-11-20 21:59:12 +10:30
coolGi 374b859882 Fixed Indium dialog not showing 2023-11-20 21:47:35 +10:30
coolGi a98bdb94b8 Fixed <br/> not being parsed correctly 2023-11-20 00:40:16 +10:30
coolGi de390f5d70 Fixed updater's back up method deleting the wrong jar 2023-11-19 22:48:46 +10:30
coolGi 9d4968351b Fixed updater crashing without network 2023-11-19 20:07:35 +10:30
coolGi e99fbb76bf Added temporary solution to file update from 1.6 2023-11-18 23:52:30 +10:30
coolGi fd175d2f36 Updated core sub-project 2023-11-18 21:45:52 +10:30
coolGi 0db862e42b Added a notification when Indium is not installed (cus people don't read the crash logs!!!) 2023-11-18 21:32:38 +10:30
coolGi 58f5d64f91 Bumped version number to 2.0.1-a-dev 2023-11-18 20:34:22 +10:30
James Seibel bb54a94acd re-add "-dev" to the version number
For future releases the version number should be changed immediately beforehand.
2023-11-16 19:09:37 -06:00
James Seibel e34a7eef06 Remove "-dev" from the version number 2023-11-16 18:54:44 -06:00
James Seibel 3d177369ab Fix Optifine rendering a blank screen until resized 2023-11-14 07:36:49 -06:00
James Seibel 946aff24af Update coreSubProjects 2023-11-10 07:02:58 -06:00
James Seibel 424429bff1 Minor core refactor 2023-11-08 19:42:43 -06:00
coolGi 55df8daa35 Added key detection through the new test screen 2023-11-08 01:26:37 +10:30
James Seibel 734edeaba9 Fix transparent water when transparency is disabled 2023-11-06 07:49:06 -06:00
James Seibel 48452e6fe7 Fix some chunks not updating 2023-11-05 15:54:23 -06:00
coolGi 314c88a452 Merge remote-tracking branch 'origin/main' 2023-11-05 17:19:26 +10:30
coolGi 3a782a1c4b Fixed forge 1.16 & 1.17 2023-11-05 17:19:16 +10:30
James Seibel 924b2b7e8e Update coreSubProjects 2023-11-04 15:42:32 -05:00
James Seibel 34565992ea Only log broken BlockState and Biomes deserializations once 2023-11-04 15:42:16 -05:00
James Seibel dbc84cc0f3 Add invalid fullData ID handling 2023-11-03 19:43:00 -05:00
coolGi 15de27eafd Fixed compilation for 1.16 & 1.17 (missed last time) 2023-11-04 02:30:31 +10:30
coolGi 8a882d7bf4 Fixed compolation on older mc versions 2023-11-03 23:20:26 +10:30
coolGi 04ee9d58bc Equal was notted accidentally 2023-11-03 23:05:59 +10:30
coolGi ee867e972f Fix for when there is a chance of mc being null 2023-11-03 23:02:43 +10:30
James Seibel a227547daa Fix Optifine shaders not rendering 2023-11-02 21:45:12 -05:00
James Seibel ef1699f2e9 re-add CPU option I_PAID_FOR_THE_WHOLE_CPU 2023-11-01 21:14:02 -05:00
James Seibel 108f692c82 Add additional safeguards to RegionFileStorageExternalCache storage.getRegionFile() 2023-11-01 21:11:24 -05:00
James Seibel a3026fbb61 Add a FIXME comment 2023-10-31 20:29:30 -05:00
James Seibel 33c2ca839e Fix incorrect chunk saving for MC 1.16/1.17 2023-10-31 20:21:22 -05:00
James Seibel 4ac4daeac1 Reduce the chance of concurrent Long2ObjectLinkedOpenHashMap issues 2023-10-31 19:56:04 -05:00
James Seibel 49f90aa5c9 Fix memory leak in MC 1.17 and 1.16 from ChunkWrapper 2023-10-31 19:53:59 -05:00
coolGi 6788ac41c5 Fixed building for pre 1.20 2023-10-31 20:22:30 +10:30
coolGi 8e25deb33d Refactor of GitInfo. Removed core commit, and added Build Source 2023-10-31 19:35:10 +10:30
coolGi 3d31d20a46 Refactor of GitInfo. Removed core commit, and added Build Source 2023-10-31 19:35:07 +10:30
James Seibel 7b902a4be1 Fix world gen freezing for certain MC versions 2023-10-30 22:18:24 -05:00
James Seibel fbd48b3cfa fix server shutdown null pointer 2023-10-30 18:43:20 -05:00
coolGi 9475040627 Updated dependancies 2023-10-31 01:04:57 +10:30
coolGi a673a3be4b Merge remote-tracking branch 'origin/main' 2023-10-31 00:34:04 +10:30
coolGi 2d444ab0bf Fixed Alex's Caves compat 2023-10-31 00:31:38 +10:30
James Seibel 95e29f36ef minor ClientBlockStateCache refactor 2023-10-30 07:46:46 -05:00
James Seibel ad97f322b2 Fix aether block tinting without breaking vanilla oceans 2023-10-30 07:46:21 -05:00
James Seibel f19281e832 Update coreSubProjects 2023-10-29 16:10:00 -05:00
James Seibel 3c91e53228 Merge branch 'minecraft-lod-mod-refactor/client-world-close' 2023-10-29 16:09:47 -05:00
James Seibel 3f35909641 Reduce CPU load when moving around the world
Should've made this multiple commits, but too late now

- Create ConfigThreadPool to remove duplicate thread setup/config code
- Move configurable thread pools into their own ThreadPools class
- Add a semaphore to limit how many LOD builder/lighting/bufferBuilder threads can be active at once
2023-10-29 15:04:46 -05:00
James Seibel 384ba30a61 Update coreSubProjects 2023-10-28 12:19:46 -05:00
James Seibel 33b5c225a4 Remove broken chunkSaveEvent, was actually chunkUnloadEvent 2023-10-28 11:53:32 -05:00
James Seibel 1a3560feef comment out GL message logging for MC 1.20.2 2023-10-28 10:23:28 -05:00
James Seibel ae2e45b52f Fix GPU Upload methods and some minor memory leaks 2023-10-28 10:18:59 -05:00
s809 1bb2ef29f5 Move closing of client world to a proper place 2023-10-28 19:43:22 +05:00
James Seibel 59ad956ba1 Fix index out of bounds 2023-10-27 20:01:49 -05:00
James Seibel 4af6ec7428 Fix GLVertexBuffer memory leak 2023-10-27 19:42:21 -05:00
James Seibel 32b59ee8a4 Revert "Fix broken LOD building when the Aether is installed"
This reverts commit 070d7e23d5.
2023-10-27 07:49:31 -05:00
James Seibel 0d5a8dee73 Attempt to reduce memory leaking when flying 2023-10-25 07:52:18 -05:00
James Seibel 91863034e8 Fix Optifine shader rendering 2023-10-24 20:12:56 -05:00
James Seibel f705fee90f Fix ClientBlockStateCache missing import 2023-10-24 20:04:47 -05:00
James Seibel d10a9e08d7 Merge in IMS' GL object changes 2023-10-24 07:31:43 -05:00
James Seibel 070d7e23d5 Fix broken LOD building when the Aether is installed 2023-10-23 20:32:05 -05:00
James Seibel 1b200259c5 Add Sqlite to the readme 2023-10-23 20:29:47 -05:00
James Seibel e21149466e update localization files 2023-10-21 11:26:13 -05:00
James Seibel f6528be87f Fix missing import 2023-10-21 11:17:40 -05:00
James Seibel e8c2271db8 Fix 1.16 compiling and double closing buffers 2023-10-21 11:14:34 -05:00
James Seibel 9f5c63d9e2 Fix LodRenderSection memory leak 2023-10-21 09:34:43 -05:00
James Seibel 539048bfac Fix missing localization for noiseSteps.@tooltip 2023-10-20 20:11:17 -05:00
James Seibel e155e68289 Add a config to change the number of light baking threads 2023-10-20 20:09:21 -05:00
James Seibel 083fab7323 Ops, missed one of the lightmap changes 2023-10-20 19:34:05 -05:00
James Seibel 5450a7efe4 Fix memory leaks when moving between dimensions 2023-10-20 19:24:05 -05:00
James Seibel f6860ed4af Update coreSubProjects 2023-10-19 22:15:42 -05:00
James Seibel 15ed0c2392 bandaid fix for World gen holes 2023-10-19 22:13:44 -05:00
James Seibel 22f290c8a3 minor refactor 2023-10-19 21:45:11 -05:00
James Seibel 6d39fb23d6 Fix never ending world gen tasks 2023-10-19 20:47:41 -05:00
James Seibel 0a523b99c7 Fix Sqlite memory leak 2023-10-19 20:11:49 -05:00
James Seibel c537ab2082 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-10-19 18:28:36 -05:00
James Seibel 63005035d7 Disable MC 1.17 lighting (always use DH lighting)
Something in MC 1.17 is broken so chunks that DH gets may be broken about 25% of the time.
2023-10-19 18:28:23 -05:00
coolGi c8d03a625a Updated sub-project 2023-10-20 00:57:57 +10:30
James Seibel d11d26dc9f fix localization and render startup for 1.16 2023-10-19 07:28:01 -05:00
James Seibel 1932cf9e76 Fix chunkwrapper null pointer 2023-10-19 07:27:31 -05:00
James Seibel 97e6797fea Fix MC 1.16/1.17 compiling 2023-10-19 07:27:23 -05:00
James Seibel c4105c3014 Fix Forge not rendering 2023-10-19 07:04:24 -05:00
James Seibel 826b4a6305 Fix section null pointer error for MC 1.16 2023-10-18 22:01:36 -05:00
James Seibel 0cb0874c54 Fix black chunks on fabric 1.20.2 2023-10-18 21:16:05 -05:00
James Seibel b831dd84e4 Fix LOD render distance measured as the diameter instead of radius
Closes #565
2023-10-18 07:51:25 -05:00
James Seibel 6775bf8a3d Fix transparent fog rendering 2023-10-18 07:24:24 -05:00
James Seibel 61402afd93 Fix DH auto update jar deletion and add more logging 2023-10-17 21:43:01 -05:00
James Seibel c5cff674fe Add GLStates around the DhApplyShader 2023-10-16 21:58:01 -05:00
James Seibel 679b5c082a Fix transparent LODs overwriting opaque LOD alpha values 2023-10-16 21:33:50 -05:00
James Seibel e00faa8e3c Fix crashing on Mac and GL4.3 and older 2023-10-16 20:45:05 -05:00
James Seibel e5265f3dbb Add (mac broken) FrameBuffer application 2023-10-15 18:05:38 -05:00
coolGi 71e3e10280 Updated core sub-module 2023-10-14 22:48:10 +10:30
James Seibel 9443f6d1e5 Have GLProxy attempt creating contexts with all supported GL versions 2023-10-13 21:56:10 -05:00
James Seibel 415c553308 Add IDhApiRenderProxy for getting/setting framebuffers and textures 2023-10-13 19:58:12 -05:00
coolGi 4b783df11e Fixed lod's being rendered underwater 2023-10-13 23:26:06 +10:30
James Seibel 6d7135ef29 Fix black chunks when Sodium is installed 2023-10-13 07:36:44 -05:00
James Seibel c0f8b6729b Fix missing MC sky 2023-10-12 21:35:09 -05:00
James Seibel a5a01b8a76 Disable the russian translation 2023-10-12 19:47:22 -05:00
James Seibel ecd44d9d31 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-10-12 19:43:00 -05:00
James Seibel fb4f0b0440 Improve SSAO class readability 2023-10-12 19:42:53 -05:00
coolGi c0bd3dda19 Surrounded the Java location with quotations so paths with spaces work 2023-10-13 02:54:32 +10:30
coolGi d4c94ea5e4 Attempt to find Java's binary to use for the self updater on Windows 2023-10-13 02:00:16 +10:30
coolGi 1a48d161d9 Updater now works with spaces in file paths 2023-10-13 00:07:02 +10:30
James Seibel adbb9cbc40 Fix SSAO Rendering 2023-10-12 07:49:11 -05:00
coolGi 40db006d62 Fixed compilation for older mc versions (again) 2023-10-12 23:08:12 +10:30
James Seibel ed64e83807 Re-add OpenGL debug config options, also remove debug LOD update configs 2023-10-10 20:40:55 -05:00
James Seibel 644b5462f1 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-10-10 19:35:40 -05:00
James Seibel 33aded7345 Fix Light map flickering when multiple client levels are active 2023-10-10 19:33:10 -05:00
coolGi d04314a9ee Fixed compilation for older mc versions 2023-10-11 01:40:15 +10:30
coolGi fadc2e7ab4 Disabled relocation for sqlite (relocation bug on their end) 2023-10-11 01:19:31 +10:30
coolGi 8fc6d4a1de Changed self updater location to use the class' path 2023-10-10 23:05:42 +10:30
coolGi 87c3f5549c Updated core subproject 2023-10-10 22:57:59 +10:30
coolGi 1e9120c6d9 Relocated the sqlite dependency in the jar 2023-10-10 22:48:20 +10:30
James Seibel 53a6b9fcd0 merge in Steveplays Frame/Depth buffer changes 2023-10-10 07:01:27 -05:00
James Seibel 682fb11e9e Fix render cache clearing deleting the database instead of removing the cache data 2023-10-08 21:17:44 -05:00
James Seibel 17f515ef06 Move some ForgeApi code into common 2023-10-08 21:00:54 -05:00
James Seibel 3f6bc262cd Fix forge (and fabric) not updating LODs when placing/breaking blocks 2023-10-08 20:56:48 -05:00
James Seibel 5f025808ab Fix singleplayer Forge worlds not updating loaded/saved chunks 2023-10-07 21:29:58 -05:00
James Seibel b93c5815c7 Update coreSubProjects 2023-10-07 20:21:06 -05:00
James Seibel 1482bfcd07 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-10-07 18:51:18 -05:00
James Seibel 71634f509a Update coreSubProjects 2023-10-07 18:50:46 -05:00
coolGi 608e2d5723 Used .renameTo instead of .canWrite to check if file is unlocked 2023-10-06 18:02:30 +10:30
coolGi f39d2d92f7 Updated core submodule 2023-10-06 17:24:37 +10:30
coolGi 264a9b66fa Fixed (hopefully) updater on Windows 2023-10-06 17:23:17 +10:30
coolGi bee9cce881 Temporary fix for windows file locking 2023-10-06 16:26:44 +10:30
coolGi ec63a025fd Disabled updating to the same commit 2023-10-05 13:12:39 +10:30
coolGi 69c5f49c72 Seeing if this will fix DH auto-updates on windows 2023-10-05 13:09:45 +10:30
coolGi 64d2363050 Fixed fabric mod json 2023-10-04 13:02:24 +10:30
coolGi 796f450091 Revert "Renamed cursedforge reference in gradle"
This reverts commit 7fb021010c.
2023-10-04 13:02:01 +10:30
coolGi aa0f274b87 Updated root subproject 2023-10-03 23:43:07 +10:30
coolGi c3103810db Moved run directory to root of the project 2023-10-03 23:41:23 +10:30
coolGi 7fb021010c Renamed cursedforge reference in gradle 2023-10-03 23:36:42 +10:30
coolGi b5267a0658 Added "provides" for our old modid 2023-10-03 23:09:08 +10:30
coolGi 1775a58938 Updated core submodule 2023-10-03 22:48:13 +10:30
coolGi 76f7371057 Fixed building for all mc versions 2023-10-03 16:44:18 +10:30
coolGi 727d7ee346 used .equals for string 2023-10-03 16:21:42 +10:30
coolGi 40618bc35a Fixed up button for 1.20.2 2023-10-03 16:01:30 +10:30
coolGi 2463d8c024 Added option to allow button background to not appear 2023-10-03 14:38:52 +10:30
coolGi 90c53d8116 Fixed button textured stuff 1.20.1 and prior 2023-10-03 14:26:24 +10:30
coolGi eb4e3bc793 Fixes to screen class not being imported 2023-10-03 02:18:59 +00:00
James Seibel 172d43a11b git ignore sqlite databases 2023-10-02 19:37:58 -05:00
coolGi 75419ed5ae Updated core submodule 2023-10-02 14:16:50 +10:30
coolGi 94978fe10a Fixed updater on 1.20.2 2023-10-02 14:16:08 +10:30
coolGi 71493e79d5 Hopefully fixed 1.20.2 building 2023-10-02 12:33:44 +10:30
coolGi 48fc9d13ad Updated core sub-project 2023-10-02 11:40:46 +10:30
coolGi 867152fdf2 Fixed renderChunkLayer injection point (1.20.2) 2023-10-02 11:40:33 +10:30
coolGi 7d13cb4905 bumped manifold version 2023-10-02 11:26:41 +10:30
coolGi 115c531be2 Fixed building on forge 2023-10-02 10:58:36 +10:30
coolGi fee8dc9b13 1.20.2 now builds (config looks odd, and updater disabled) 2023-10-01 22:32:19 +10:30
James Seibel 0bbaa15579 add basic sqlite and unit tests 2023-09-30 15:25:48 -05:00
James Seibel aeb7cf6ff1 Fix multiplayer similarity percent 2023-09-29 23:17:38 -05:00
James Seibel 0be45abc28 change ClientLevelWrapper getDimType to IDimensionTypeWrapper 2023-09-29 22:42:41 -05:00
James Seibel a6bff2abb0 Improve world gen for partially generated sections 2023-09-28 07:26:30 -05:00
James Seibel f4d6e63c47 Fix MixinLevelRenderer compling for 1.19.2 and lower MC versions 2023-09-26 19:03:55 -05:00
James Seibel 2edabc7168 Merge branch 'vivecraft' 2023-09-26 18:05:26 -05:00
coolGi 46e5bf24ca Close IO steams when done using them 2023-09-27 00:02:15 +09:30
coolGi ba014fc581 Updated core subproject 2023-09-27 00:00:19 +09:30
coolGi 225dad9d84 Disabled changelog button if using nightly 2023-09-26 23:11:54 +09:30
coolGi ca2914d3a9 Changed update screen to use short sha 2023-09-26 23:11:31 +09:30
coolGi 85203847d5 Updated core sub-project (again) 2023-09-26 23:01:03 +09:30
coolGi db2cdbaecd Updated core submodule 2023-09-26 22:58:05 +09:30
coolGi 3a80c6f59e Added nightly to be auto-updated 2023-09-26 22:53:12 +09:30
James Seibel 0137a6bfd0 Fix full data sampling 2023-09-24 21:22:15 -05:00
AquaticLava 8b4c647fd2 change method to private 2023-09-24 12:56:39 -06:00
AquaticLava d4ba61e341 Fix vivecraft incompatibility - forge 2023-09-24 12:56:22 -06:00
AquaticLava 634df3ba06 Fix vivecraft incompatibility 2023-09-23 23:33:24 -06:00
coolGi 88766f30e4 Updated core submodule 2023-09-24 11:20:41 +09:30
coolGi 14a15754fb Made config use our lang for everything 2023-09-24 11:18:31 +09:30
coolGi c919fe9ab0 Updated manifold version 2023-09-24 10:42:03 +09:30
James Seibel 13bf04ef2d Remove Sodium < 0.5.1 incompatability
Fixed via using Indium
2023-09-23 16:11:12 -05:00
James Seibel e42919c37f Add a config for synchronous GPU uploading
hopefully to help with Sodium/AMD issues
2023-09-23 16:06:04 -05:00
James Seibel 5a3bd0c9dd remove ReflectionHandler 2023-09-23 11:54:10 -05:00
James Seibel e1907245e2 Replace sodium mixins with an Indium dependency 2023-09-23 11:11:24 -05:00
James Seibel e476b56ac1 BatchGenerationEnvironment refactor and spelling fix 2023-09-23 08:31:02 -05:00
James Seibel 776ec93d09 Fix potential concurrency issue in BatchGenerationEnvironment 2023-09-23 08:30:23 -05:00
James Seibel fc0aafb070 Improve world gen GC pressure, break dataSource thread safety, and fix a sampling bug 2023-09-21 22:02:39 -05:00
James Seibel 54fa033e07 Add GL Context creation debug configs 2023-09-16 08:03:48 -05:00
James Seibel cbd0521a0c Add a mutable DhSectionPos 2023-09-15 07:34:42 -05:00
James Seibel e958790f76 Fix compiling for MC 1.16 - 1.19 2023-09-15 07:05:15 -05:00
James Seibel 06bb4a9cb3 Refactor and Optimize DhSectionPos 2023-09-14 22:05:05 -05:00
James Seibel b38a8d5e62 Add the ability to set Minecraft's memory JVM argument in gradle.properties 2023-09-13 18:53:23 -05:00
James Seibel 84028f78b8 Hopefully fix Structure load locking up the world gen threads (again) 2023-09-13 18:30:22 -05:00
James Seibel 515c45b4c8 Add unused data source automatic freeing 2023-09-12 20:16:45 -05:00
James Seibel 0cac09aec1 reformat ChunkLightStorage 2023-09-11 21:02:15 -05:00
James Seibel 695809d573 Merge branch 'minecraft-lod-mod-betterLightStorage' 2023-09-11 20:39:56 -05:00
James Seibel e12f33a938 DhLightingEngine Optimization from Builderb0y 2023-09-11 20:35:46 -05:00
Builderb0y 8e69174d5a Update 2 files
- /common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkLightStorage.java
- /common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java
2023-09-12 00:44:58 +00:00
James Seibel 3ea6bee3cf Merge branch 'minecraft-lod-mod-iris.shadow.fix' 2023-09-11 07:38:04 -05:00
James Seibel c1fda715d0 Improve LOD Building and Lighting speed for BigGlobe worlds
Thanks Builderb0y!
2023-09-11 07:26:09 -05:00
James Seibel e4a7056d48 Optimize ChunkWrapper.getBlockState() 2023-09-10 19:39:34 -05:00
James Seibel 2107d3cbbd Optimize BlockState/Biome Wrapper getter methods
The lambdas were being newly created for each get() which became difficult for the GC to handle.
2023-09-10 19:35:37 -05:00
James Seibel ef6fc07cd3 Minor ChunkWrapper.getBlockState() GC optimization 2023-09-10 17:10:01 -05:00
James Seibel 56172c69a4 Fix incompatible sodium version 0.5.0 -> 0.5.1 2023-09-09 19:57:33 -05:00
James Seibel a92aa1eca8 Fix SSAO rendering when Sodium is installed 2023-09-09 18:26:16 -05:00
James Seibel f2931e8204 Fix MC 1.16 compiling fail due to logger import 2023-09-09 17:37:49 -05:00
James Seibel 5d47a5f391 Fix shadow static rendering 2023-09-09 17:03:47 -05:00
James Seibel 299fbe7336 Use MC's projection matrix in SSAO instead of creating a new one 2023-09-09 16:45:46 -05:00
James Seibel b30c8ea413 Fix crashing due to Chunk Wrapper concurrency 2023-09-09 16:28:56 -05:00
James Seibel 64dea2d730 Reduce duplicate Client Chunk update calls 2023-09-09 13:37:04 -05:00
James Seibel 9edba26910 Potentially fix stuttering when flying around the world 2023-09-09 12:49:31 -05:00
James Seibel cf6b3d9a89 Add debug options to skip some full data update events 2023-09-08 22:32:37 -05:00
James Seibel 47f297809b add blend-alpha to GLState (thanks Null!) 2023-09-08 20:01:08 -05:00
James Seibel 12b4521df6 Remove LodQuadBuilder transparent void fix 2023-09-08 19:56:22 -05:00
James Seibel 48291e261e Optimize Buffer building 2023-09-08 07:54:28 -05:00
James Seibel 7c9fd5be9c Fix Fabric UI mixin fail for MC 1.19 and below 2023-09-07 07:05:05 -05:00
James Seibel 8d822d7f3c Add Null's SSAO improvements 2023-09-06 21:25:57 -05:00
James Seibel f42a76c8fd Render file handling refactors 2023-09-02 21:07:08 -05:00
coolGi 8765f9effa Updated core subproject 2023-09-02 21:05:32 +09:30
coolGi 276b839668 Fixed fog not applying correctly with blindness or darkness 2023-09-02 21:03:24 +09:30
coolGi 507b045eb9 Fixed deep dark not blackening lods 2023-09-02 20:59:31 +09:30
coolGi 1de8cfb001 Forgot forge was weird with mixins 2023-09-02 20:55:02 +09:30
coolGi 1ab8483df5 Added tripwire to ignored blocks 2023-09-02 20:48:04 +09:30
coolGi 969edef3b2 Updated core submodule 2023-09-02 20:11:03 +09:30
coolGi 20be303dd0 Fixed crash ran on version not on Modrinth 2023-09-02 20:10:56 +09:30
James Seibel fc43f866a1 Add missing licensing headers 2023-09-01 20:43:31 -05:00
James Seibel eca04899de Update existing licensing headers 2023-09-01 07:44:23 -05:00
James Seibel 7b7fb8db44 Add file write locking to AbstractMetaDataContainerFile 2023-08-31 22:01:48 -05:00
James Seibel 313b660334 Remove debug disable lighting engine configs 2023-08-31 21:43:21 -05:00
James Seibel 5b84b26b67 Move Fog and SSAO matrix inversions to the CPU 2023-08-31 21:16:09 -05:00
James Seibel 6dc567e079 Make kelp opaque in MC 1.19 and below to match MC 1.20 2023-08-31 19:42:35 -05:00
James Seibel 13b26d5902 Fix GLProxy null pointer 2023-08-31 19:08:38 -05:00
James Seibel 3d7b21c444 Fix lighting engine setting lighting incorrectly 2023-08-31 19:02:28 -05:00
James Seibel fc5879beab Reduce DhLightingEngine GC impact 2023-08-31 07:56:00 -05:00
James Seibel 251c9d1134 Fix corrupt chunk saving for fabric 1.20 2023-08-31 07:12:56 -05:00
James Seibel 0a1bf750ba Fix disappearing LOD sections 2023-08-30 07:44:11 -05:00
James Seibel a236264d14 Add temp debug option to disable lighting engine and light baking 2023-08-30 07:08:00 -05:00
James Seibel ba45a7c2f5 Fix fabric corrupted LODs on MC 1.19 2023-08-28 06:41:19 -05:00
James Seibel 95b1ecff0d Add Fabric incompatibility list to versionProperties
also mark Sodium <0.5 as incompatible for 1.20
2023-08-27 14:14:00 -05:00
James Seibel 8ad5565148 Convert WorldGenQueue to use SectionPos instead of LodPos 2023-08-27 07:53:44 -05:00
James Seibel 5cda6a6f2c fix render source null pointer 2023-08-26 21:53:07 -05:00
James Seibel 6f35d0710e fix quality preset cache reset firing too often 2023-08-26 17:57:40 -05:00
James Seibel 0c87a2a9ea Fix api:javadoc compiling and warnings 2023-08-26 17:32:55 -05:00
James Seibel 3ddc315826 Fix 1.16 compiling 2023-08-26 15:19:19 -05:00
James Seibel b888103c80 Add IDhApiConfigValue.addChangeListener() 2023-08-26 13:11:21 -05:00
James Seibel 09e689dc2f Add a ReadMe to DhApi 2023-08-26 11:19:54 -05:00
coolGi 0f61affac8 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
2023-08-27 01:38:27 +09:30
coolGi 57e44cc4a7 Updated core sub-project 2023-08-27 01:37:32 +09:30
coolGi 876c4f2510 Moved fabric api stuff 2023-08-27 01:37:16 +09:30
James Seibel 6c4364f009 Remove unused IDhApiConfigValue.getApiValue() 2023-08-26 10:56:36 -05:00
James Seibel d96fc3c73b Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-08-26 10:43:43 -05:00
James Seibel e3da644b1c Optimize SSAO rendering 2023-08-26 10:43:17 -05:00
coolGi 34bb512f03 Disabled SVG from being included in the jar 2023-08-27 01:02:05 +09:30
coolGi fae58503a8 Removed flatlaf 2023-08-27 00:59:36 +09:30
James Seibel 0ea69d0ca4 Add OpenGL error log config 2023-08-26 08:51:27 -05:00
coolGi 3144e9d957 Updated core-subproject 2023-08-26 17:29:48 +09:30
James Seibel 30fac5e5ce Remove deprecated getX() and getZ() from DhChunkPos 2023-08-25 21:17:54 -05:00
James Seibel 37cbeebaa5 Fix BCLib compiling for MC 1.16 and 1.17 2023-08-25 18:26:52 -05:00
James Seibel 3aa6cc3383 Attempt to fix LodRenderer freeing GL objects while they are in use 2023-08-25 07:52:20 -05:00
James Seibel 56dd3c352e Fix BCLib compiling for MC 1.16 and disable 1.17 2023-08-25 07:19:12 -05:00
James Seibel 83fa1a0281 Require a ILevelWrapper when deserializing BiomeWrappers 2023-08-24 21:38:01 -05:00
James Seibel 5b4049e0ca Require a ILevelWrapper when deserializing BlockStateWrappers 2023-08-24 20:10:59 -05:00
coolGi 888651ef52 Fixed duplicate bclib code from previous commit 2023-08-25 00:14:37 +09:30
coolGi a122b2c143 Fixed javadocs reference, and updated core 2023-08-25 00:10:34 +09:30
coolGi a41afa0dbf Fixed BCLib compat 1.19.4+ 2023-08-25 00:09:57 +09:30
coolGi d9b969e7a7 Fixed up git on ci (well, kinda) 2023-08-24 23:35:20 +09:30
James Seibel 9297ac4c35 Fix config presets rewriting the config file before it loads 2023-08-24 07:41:14 -05:00
James Seibel 7ee42a9529 Add missing render cache config listeners 2023-08-24 07:21:05 -05:00
James Seibel 640559239c Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-08-24 07:08:39 -05:00
coolGi 263574bf38 Added string (tripwire) to the ignored blocks 2023-08-24 21:26:24 +09:30
coolGi 60cbbb0393 Updated core sub-project 2023-08-24 21:20:46 +09:30
coolGi 91f9f17989 Merge branch 'main' into 'main'
feat: Update rendering block ignores

See merge request jeseibel/minecraft-lod-mod!35
2023-08-24 11:49:33 +00:00
coolGi a96e345fbe Updated core subproject 2023-08-24 21:13:23 +09:30
coolGi 9ffc54f0b1 Updated readme 2023-08-24 21:12:56 +09:30
coolGi bf3428b53c Added version number to bottom left of config (#558) 2023-08-24 21:07:05 +09:30
coolGi c78f6eb66d Added blendium to mod suggestion on fabric 2023-08-24 20:58:43 +09:30
coolGi 73f4bc3108 Formatted some resource files 2023-08-24 20:28:25 +09:30
James Seibel 73a42284f1 Fix MC 16, 17, 18, and 19 compiling 2023-08-23 22:15:51 -05:00
James Seibel 90accf01db Fix a null pointer 2023-08-23 22:00:13 -05:00
James Seibel 1cb60f6a6d Add core merge 2023-08-23 21:28:46 -05:00
James Seibel bfcc4b001d Merge branch 'steve-ignore-blocks' 2023-08-23 21:28:29 -05:00
James Seibel 2f7852f103 Revert Air Block handling and use the old (de)serialization logic
While having the ability to deserialize blockstates without a level is desired, I'm not sure if the method suggested here would work between MC versions or would support modded blocks (in the eventual case where someone wants to do that).
2023-08-23 21:25:40 -05:00
James Seibel 944b3c05ab Fix Fabric 1.18.2 saving black/empty chunks 2023-08-22 17:45:54 -05:00
James Seibel 531a308b39 Fix file saving 2023-08-22 07:45:33 -05:00
Steveplays28 27cd001680 feat: Update rendering block ignores
Barrier blocks, structure void blocks, light blocks, and air blocks now share 2 `HashMap`s that define blocks that should be ignored by the LOD builder.
2023-08-22 11:36:45 +02:00
James Seibel e5ee46335d Fix potential null pointers in DhWorld shutdown 2023-08-21 07:46:58 -05:00
James Seibel ef72cdc0e6 Add a profiler section for debug wireframe rendering 2023-08-20 18:38:27 -05:00
James Seibel 246bd54b55 Update coreSubProjects 2023-08-20 18:22:14 -05:00
James Seibel e1147f3f60 Replace ChunkWrapper LinkedList with ArrayList 2023-08-20 17:07:30 -05:00
James Seibel 3bc0104268 hide unused multiplayer configs 2023-08-20 15:13:37 -05:00
James Seibel 50e9a51f56 Fix LevelWrappers not unloading correctly 2023-08-20 14:47:36 -05:00
James Seibel 87fec5276d Add world gen task count to the F3 menu 2023-08-20 14:15:06 -05:00
coolGi 2b734bb8d4 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
2023-08-20 02:54:43 +09:30
coolGi 2d93a23da9 Updated core subproject 2023-08-20 02:54:27 +09:30
coolGi 1ac1b7ee2d Fixed ui modify, and made file handeler use its own set function 2023-08-20 02:36:48 +09:30
James Seibel 81adca92c0 Add a flag to enable/disable ChunkWrapper Index validation 2023-08-19 11:18:49 -05:00
coolGi d509694ba9 Re-arranged the git info 2023-08-20 01:35:48 +09:30
James Seibel 7f658bd310 Fix lighting and LOD generation for snow layers 2023-08-19 11:02:00 -05:00
James Seibel d7728cce45 Update manifold 2023.1.11 -> 2023.1.15 2023-08-19 07:18:52 -05:00
tom lee 4d649d8a33 Implement cache invalidation, and have render cache be used. Can expect faster load times. 2023-08-19 16:49:29 +08:00
James Seibel c3d0cc2da8 Potentially fix custom world generator snow lighting 2023-08-18 20:51:36 -05:00
James Seibel 0b67d64ff4 Fix compiling for MC 1.19 and lower 2023-08-18 18:55:27 -05:00
James Seibel 386dc38150 Remove height map optimization in LodDataBuilder 2023-08-18 18:44:46 -05:00
James Seibel ba6b08b818 Fix compiling for MC 1.19 and lower 2023-08-18 18:21:59 -05:00
James Seibel 2cfef3a84d Fix snow rendering take 2 2023-08-18 18:15:13 -05:00
James Seibel 8b20e1ee6d Attempt to fix a potential StructureLocator concurrency issue 2023-08-18 18:06:04 -05:00
James Seibel b254fde3ae Attempt to fix snow lighting 2023-08-18 17:22:39 -05:00
James Seibel 876989346b Fix biome non-existent exception when saving chunks on Fabric 2023-08-18 16:49:41 -05:00
James Seibel 7278bc1548 World gen step reformatting 2023-08-18 16:06:55 -05:00
James Seibel 1728c3e898 remove part of temp fix for block/sky light indexes in ChunkWrapper 2023-08-18 16:03:16 -05:00
James Seibel 80393529f1 minor world gen step refactor 2023-08-18 15:56:40 -05:00
James Seibel b9d635ac69 Fix potential missing heightmap when generating chunks 2023-08-18 15:56:21 -05:00
James Seibel cca668979f Remove MC's lighting engine from the world generator 2023-08-18 11:55:40 -05:00
James Seibel 0e017cf512 hopefully prevent world gen structure lockup when leaving the world 2023-08-18 09:11:00 -05:00
James Seibel b1e75431ae Fix WorldGen ThreadFactory not being used 2023-08-18 08:25:23 -05:00
James Seibel e12d7766d6 Fix a null pointer in ClassicConfigGui 2023-08-18 07:59:28 -05:00
James Seibel e43ee68508 Fix preset configs not applying after the UI screen changes 2023-08-18 07:51:15 -05:00
James Seibel 9a9aac64af Update coreSubProjects 2023-08-17 22:18:00 -05:00
James Seibel 5193a3313d Merge branch 'main' into 'main'
Fix querying block colors at constant position.

See merge request jeseibel/minecraft-lod-mod!34
2023-08-18 03:05:23 +00:00
James Seibel 2ff1b80650 Fix weird rendering on Intel GPUs 2023-08-17 21:05:05 -05:00
Builderb0y 7e0e51103b Fix querying block colors at constant position. 2023-08-18 01:57:08 +00:00
coolGi 2977486866 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
2023-08-17 23:27:48 +09:30
coolGi bb9df60004 Updated core subproject 2023-08-17 23:25:36 +09:30
James Seibel a1b42f61fb Update coreSubProjects 2023-08-17 07:23:25 -05:00
coolGi b394c01f47 Changed inject to the correct point (thx @Steveplays) 2023-08-16 20:02:49 +09:30
coolGi c047996592 This revert commit 21144a7c 2023-08-16 19:38:49 +09:30
James Seibel cc2340d1b9 Add a .editorconfig to core 2023-08-15 20:50:52 -05:00
James Seibel 01b233e968 Potentially fix lag when moving across chunk borders 2023-08-15 20:49:29 -05:00
coolGi c53cf3f870 Fixed fabric 1.16.5 2023-08-15 14:51:57 +09:30
coolGi 4f0da248e3 Fixed git submodule not getting commit 2023-08-15 14:44:10 +09:30
coolGi 44688afeb9 Updated settings.gradle to 1.20.1 2023-08-15 13:23:07 +09:30
coolGi 4301ed9917 Fixed building for pre 1.19 2023-08-15 13:16:39 +09:30
coolGi 0b26f8ce3c Updated core subproject 2023-08-15 13:00:51 +09:30
coolGi 815aed53fc Removed unused accessors 2023-08-15 13:00:41 +09:30
coolGi 9cde0edfa3 Didnt merge it correctly 2023-08-15 12:52:59 +09:30
coolGi 70b3ba0040 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
#	fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java
#	fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java
#	fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/mods/sodium/MixinSodiumRenderer.java
#	fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/SodiumAccessor.java
2023-08-15 12:50:20 +09:30
coolGi 32c89b1af9 Updated core submodule 2023-08-15 12:47:43 +09:30
coolGi 21144a7ce4 Fix to sodium, now no longer requiring Mixins 2023-08-15 12:47:13 +09:30
James Seibel 0935a6e94b Fix ClientBlockDetailMap.getBlockStateData not passing the BlockPos
Thanks Builderb0y
2023-08-14 22:01:03 -05:00
coolGi f28f09dd40 Tmp fix for sodium 2023-08-15 11:54:41 +09:30
James Seibel f564755d66 Apply editorconfig auto formatting 2023-08-14 21:16:13 -05:00
James Seibel 2af274171c Create .editorconfig 2023-08-14 20:48:14 -05:00
James Seibel de726b7669 Fix ModGitInfo crashing on release MC 2023-08-14 07:30:48 -05:00
James Seibel 22d134e786 Fix MC 1.17 compiling 2023-08-14 07:12:56 -05:00
James Seibel 642b040f65 change the default MC version to 1.20.1 2023-08-13 18:07:32 -05:00
James Seibel 0cc883b6c3 Fix unnecessary region file concurrency warnings in MC 1.16 and 1.17 2023-08-13 17:51:10 -05:00
James Seibel 902362f54f Fix 1.16 and 1.17 compiling 2023-08-13 17:23:36 -05:00
James Seibel f9c946e3ce Improve DhLightingEngine performance 2023-08-13 17:10:45 -05:00
James Seibel 9020d5bbe6 Replace ChunkWrapper light hash maps with 1D arrays 2023-08-13 17:02:45 -05:00
James Seibel fe973d27b9 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-08-13 13:37:43 -05:00
James Seibel e9c1f41f50 Fix the game instantly crashing due to running out of memory 2023-08-13 13:37:35 -05:00
James Seibel 630e3bf16f Merge branch 'local.docker.compile' into 'main'
Local docker compile

See merge request jeseibel/minecraft-lod-mod!33
2023-08-12 22:05:29 +00:00
Null 511 27df83f8e7 Local docker compile 2023-08-12 22:05:29 +00:00
James Seibel 4ad9bb0d71 Fix FullDataPointIdMap (de)serialization duplicate Entries
Potentially fix serializing Biomes/Blocks after a level has been shut down.
Also increase DATA_FORMAT_VERSION 2 -> 3
2023-08-12 16:17:59 -05:00
coolGi 4fcd4cb2f7 Merge branch 'cicd.cleanup' into 'main'
CICD Improvements

See merge request jeseibel/minecraft-lod-mod!32
2023-08-08 22:09:51 +00:00
Null 511 15beb792d1 CICD Improvements 2023-08-08 22:09:51 +00:00
coolGi 401daf907c Updated core sub-module 2023-08-08 21:23:38 +09:30
coolGi a3f6f51a7a Temporary fix for sodium 0.5's fog occlusion 2023-08-08 21:23:25 +09:30
coolGi e4cd89131e Removed test git stage 2023-08-08 20:41:23 +09:30
coolGi 32d8553b9b Added a temporary ci stage to test git 2023-08-08 20:36:35 +09:30
coolGi 092fc45a36 Updated core submodule 2023-08-07 22:05:13 +09:30
coolGi 9f58cf305f Added a warning if value doesn't have a way to display it 2023-08-07 22:05:04 +09:30
coolGi c1370e74a2 Updated core sub-module 2023-08-07 21:10:54 +09:30
coolGi 3b3ec1eee2 DH Jar now knows git version that it was built from 2023-08-07 21:10:45 +09:30
coolGi 803d26c7c7 Maybe fixed game not compiling for 1.18.2 2023-08-07 20:22:17 +09:30
James Seibel 9244f29daa Update coreSubProjects 2023-08-06 19:26:46 -05:00
James Seibel 0a9e789cdc Remove IMinecraftRenderWrapper.tryDisableVanillaFog()
They are now handled via mixins
2023-08-06 19:21:58 -05:00
James Seibel a761ef4b6b Add setUseDhLighting to ChunkWrapper 2023-08-06 19:19:45 -05:00
James Seibel 3f4df4289c minor ForgeServerProxy reformat 2023-08-06 19:19:23 -05:00
James Seibel 879c70a7a0 Fix forge vanilla fog removal 2023-08-06 19:11:09 -05:00
James Seibel b0c1f69023 add a todo comment to fabric MixinThreadingDetector to match forge 2023-08-06 17:49:14 -05:00
James Seibel 889474fb42 Add SeamlessOverdraw support for 1.16 2023-08-06 17:48:12 -05:00
James Seibel 4ad6c854c8 update comment in ChunkWrapper 2023-08-06 16:09:42 -05:00
James Seibel 521549a349 Fix MixinTextureUtil mixin crash due to incorrect package path 2023-08-06 15:37:55 -05:00
James Seibel ee06d81434 Add missing simicolons to ChunkWrapper 2023-08-06 15:20:28 -05:00
James Seibel 3f6ee90b4e Fix SodiumAccessor breaking 1.16 2023-08-06 09:23:43 -05:00
James Seibel a017586c0e Add 1.17.1 to the CI script 2023-08-06 09:09:24 -05:00
James Seibel 027b867afd Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-08-06 09:08:28 -05:00
James Seibel 67b61b55a3 Fix 1.17 compiling 2023-08-06 09:08:12 -05:00
coolGi b2efeb77e1 Started work on fix for sodium 0.5 for 1.20.x 2023-08-06 23:22:51 +09:30
coolGi 2929009e63 Merge remote-tracking branch 'origin/main' 2023-08-06 23:04:34 +09:30
James Seibel 4604751f80 Add 1.16.5 to the CI script 2023-08-06 08:32:40 -05:00
James Seibel 6906597165 Fix 1.19.2 compiling 2023-08-06 08:32:21 -05:00
coolGi 8235a911ab Fixed sodium not working on post 1.16 2023-08-06 22:18:48 +09:30
coolGi 8af8039a00 Updated core sub-module 2023-08-06 19:01:32 +09:30
coolGi b399121f20 Added a ui button option + debug menu option 2023-08-06 18:59:39 +09:30
James Seibel bf519301f5 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-08-05 22:36:18 -05:00
James Seibel 9f0378f969 comment out netty code
It broke MC 1.16
2023-08-05 22:32:57 -05:00
James Seibel ea9cb7fcac remove unused imports in BiomeWrapper 2023-08-05 22:06:09 -05:00
James Seibel 7ba1f77a19 Fix Biome/BlockState Wrapper in 1.18 and 1.19 2023-08-05 21:58:16 -05:00
James Seibel 739947e008 Fix compiling for 1.20.1 2023-08-05 21:21:32 -05:00
James Seibel cfb0dd4096 Fix Server start/end forge events 1.16 2023-08-05 19:42:17 -05:00
James Seibel 92ff5beebc Fix null biomes onChunkSave in 1.16 2023-08-05 19:39:24 -05:00
James Seibel 8bb1251dc9 Fix Sodium rendering 1.16 2023-08-05 19:15:17 -05:00
James Seibel a52a122f9f Update MixinThreadingDetector.java 2023-08-05 18:17:01 -05:00
James Seibel c90efed0fe Remove/fix Terraforged mixin 1.16 2023-08-05 18:14:46 -05:00
James Seibel b41119232e Remove BCLibAccessor from 1.16 2023-08-05 17:27:30 -05:00
James Seibel 9fefaf6eca Fix some rendering mixins 1.16 2023-08-05 16:28:10 -05:00
James Seibel b5f3be4fcc Fix BlockStateWrapper logger null pointer 2023-08-05 12:21:49 -05:00
James Seibel f6c05303ea Fix ChunkWrapper.updateClientLightReady() for 1.16 2023-08-05 11:27:38 -05:00
James Seibel 18b0b8c6f4 Fix world gen for 1.16 2023-08-05 11:27:23 -05:00
James Seibel 9c73443aa2 BatchGenEnv Java 8 fix, MC 1.16 fix, and minor reformat 2023-08-05 11:20:17 -05:00
James Seibel 8fd5c6e3a4 update manifold 2023.1.10 -> 2023.1.11 2023-08-05 11:18:11 -05:00
James Seibel fb57fbbe8d Fix GUI screens for 1.16 2023-08-05 11:17:30 -05:00
James Seibel 98d2b0db3f Fix several mixins for 1.16 2023-08-05 11:15:48 -05:00
James Seibel c895dff2c8 Convert Biome/Block wrapper serialization methods to use ResourceLocations 2023-08-05 11:12:46 -05:00
James Seibel 5cd6111e92 Fix TintWithoutLevel... objects for 1.16 2023-08-05 11:11:41 -05:00
James Seibel a57a34ab58 Fix GetConfigScreen and WrapperFactory using Java 8+ code 2023-08-05 11:10:34 -05:00
coolGi 49baaaab85 Updated core sub-module 2023-08-05 16:53:50 +09:30
coolGi f8a0ce84de Some general fixes 2023-08-05 16:53:41 +09:30
coolGi 7408187507 Updated core submodule 2023-08-05 15:07:52 +09:30
James Seibel f2c2c5dd92 Add config for Lod Shading so Old Lighting can be enabled for shaders 2023-08-01 20:11:30 -05:00
James Seibel dbefea35c2 temporarily comment out LodQuadTree concurrency warning
The warning doesn't appear to be causing any ill effects for now, but it will still need to be fixed in the future
2023-08-01 07:44:55 -05:00
James Seibel f887f38e17 Add a 1 sec timeout before applying config presets 2023-08-01 07:42:18 -05:00
James Seibel 080a99d6db Remove thread preset "paid for whole cpu" and tweak CPU preset options 2023-08-01 07:27:41 -05:00
James Seibel 7fee50883a Slightly increase the default world gen thread count and activities 2023-07-31 21:44:23 -05:00
James Seibel 9bc97780a4 temporary fix for some LODs not appearing 2023-07-31 20:51:51 -05:00
James Seibel 7b3f63a2f2 Fix a crash when the ForgeConfigApiPort mod is included 2023-07-29 17:35:00 -05:00
James Seibel 60be8302f4 Fix multiplayer networking configs and add missing localizations 2023-07-29 10:01:35 -05:00
James Seibel c2ec60c6e5 Fix Forge networked multiverse and connecting to Forge servers
This change require an additional empty byte at the beginning of the multiverse packets
2023-07-29 09:21:44 -05:00
James Seibel fef7369338 Fix default mcVer from 1.18.4 -> 1.18.2
We don't have a 1.18.4 properties file
2023-07-28 07:25:51 -05:00
James Seibel 036754c54a Fix 1.19 and 1.20 compiling 2023-07-28 07:22:45 -05:00
James Seibel 8e0ccd781b refactor FabricClientProxy 2023-07-27 21:38:58 -05:00
James Seibel 1ee02211b9 Fix Forge client-side rendering 2023-07-27 21:37:00 -05:00
James Seibel a2ac2e00da update forge 1.18.2 40.2.9 -> 40.2.10 2023-07-25 21:27:21 -05:00
James Seibel a33ecec9d3 Add missing callAfterRunUpdates to forge mixingLevelRenderer 2023-07-25 21:27:01 -05:00
James Seibel b0937fd9d0 Fix a native code crash in MC 1.20 when using seamless overdraw 2023-07-23 18:21:01 -05:00
James Seibel d1283db786 Add a config to disable multiverse networking 2023-07-23 17:35:33 -05:00
James Seibel dc556efe0b Fix blocking the server thread in 1.20.1 world generation 2023-07-23 15:32:40 -05:00
James Seibel 0ff59e49a1 Fix lighting propagation when connected to a server 2023-07-22 21:02:58 -05:00
James Seibel febf5c31cc Remove an un-needed error log in tryGetClientLevelWrapper() 2023-07-22 20:43:31 -05:00
James Seibel 1665999111 Fix BlockStateWrapper deserialization
For some reason using "JsonOps.COMPRESSED" caused issues in a few cases when trying to deserialize the JSON string.
This also causes all old Full data to be deprecated since the method of serialization was changed.
2023-07-22 18:19:31 -05:00
James Seibel 14dd26349a Fix 1.20.1 missing imports 2023-07-22 12:57:35 -05:00
James Seibel 54e356d98c Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-07-22 12:40:19 -05:00
James Seibel 959dd4e718 Add a config for world gen timeout 2023-07-22 12:34:20 -05:00
James Seibel a61b2cb2fc Rename DLodDirection -> EDhDirection and rename several methods 2023-07-22 12:20:39 -05:00
James Seibel 6ac5b7f9a3 Default to using the new lighting engine for world generation 2023-07-22 12:17:23 -05:00
coolGi 3f26a70169 Fixed fog not being properly removed on forged 2023-07-21 17:06:14 +09:30
coolGi 084bf635cb Fixed fabric crash 2023-07-21 03:18:11 +09:30
coolGi f1a7e69c63 Updated core submodule 2023-07-20 21:06:20 +09:30
coolGi 93cfc64493 Fixed parchment version 2023-07-20 20:35:29 +09:30
coolGi eeaa836c45 Fixed improper location for remap (fixing forge 1.20.1) 2023-07-20 20:13:44 +09:30
coolGi 30d3d8c52e Updated parchment version 2023-07-20 20:12:53 +09:30
coolGi eaa61098fa Made ci bit smaller 2023-07-19 23:37:21 +09:30
coolGi 2ee087f29d Fixed bclib for newer versions 2023-07-19 23:36:25 +09:30
coolGi d8861f6100 Fixed bclib crash 2023-07-19 22:41:31 +09:30
coolGi 8802ce0a32 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
2023-07-19 22:20:02 +09:30
coolGi 7405839718 Updated core submodule 2023-07-19 22:19:15 +09:30
coolGi 2d77efd8ea Save commit for fog fix 2023-07-19 22:19:01 +09:30
James Seibel 9c73926cd2 Update coreSubProjects 2023-07-17 21:44:07 -05:00
James Seibel 0c7b1e06fd Fix Fabric 1.20.1 crash on boot due to Client Networking cast failure
Not sure why the compiler didn't complain, but this explicit conversion fixes the issue.
2023-07-17 20:30:03 -05:00
James Seibel 113bd75154 Update Fabric API 0.83.1 -> 0.85.0 2023-07-17 20:29:15 -05:00
coolGi 3d268adeea Attempt to make ci smaller 2023-07-17 14:39:22 +00:00
coolGi 3ac2392edb Testing to see if i can reduce the size of the buildscript 2023-07-17 23:55:23 +09:30
coolGi 008f5cf915 Changed order of ci build 2023-07-17 23:40:07 +09:30
coolGi 77cc7fe669 Fixed up buildAll scripts 2023-07-17 23:33:25 +09:30
coolGi b6d352fbce Fixed some typos in the gradle script 2023-07-17 22:37:33 +09:30
coolGi fc8426a2ee Merge remote-tracking branch 'origin/main' 2023-07-17 22:31:01 +09:30
James Seibel cd78ffc069 Fix Netty not being embedded in the Jar correctly (Thanks coolGi!) 2023-07-17 07:55:09 -05:00
coolGi 5230a4abf9 Merge remote-tracking branch 'origin/main' 2023-07-17 22:10:11 +09:30
James Seibel c37304d114 Temporary Forge retail MC Netty library fix 2023-07-17 07:39:01 -05:00
coolGi 0144619ed4 Changed homepage from cursedforge to modrinth 2023-07-17 21:41:58 +09:30
TomTheFurry b7cc51bb3e Fixed the mem leak issue by nuking the whole save-when-exit 2023-07-17 18:46:30 +08:00
James Seibel 96c844c6e8 Update coreSubProjects 2023-07-16 22:08:08 -05:00
James Seibel 09930b1754 Reduce CPU load for lower thread presets 2023-07-16 17:41:51 -05:00
coolGi 8cf51d0f77 Merge remote-tracking branch 'origin/main' 2023-07-17 02:17:44 +09:30
coolGi d3667b0e3a Updated core subproject 2023-07-17 02:17:10 +09:30
TomTheFurry 3ae7f3a299 Update core 2023-07-17 02:17:10 +09:30
coolGi 800d64c923 Slight fix to the reliability of the auto updater 2023-07-17 02:17:10 +09:30
coolGi fd2a1ca036 Removed spaces from version properties 2023-07-17 02:17:10 +09:30
TomTheFurry d8e631f52b Update core 2023-07-17 00:06:57 +08:00
coolGi f41e182f86 Revert "Updated TexturedButtonWidget with one from stable, is it still needed?"
This reverts commit 4876ee5d7c.
2023-07-17 01:19:00 +09:30
coolGi 4876ee5d7c Updated TexturedButtonWidget with one from stable, is it still needed? 2023-07-17 01:15:09 +09:30
coolGi 58d5f16845 Merge remote-tracking branch 'origin/main' 2023-07-17 00:29:26 +09:30
coolGi b26b072332 Updated core submodule 2023-07-17 00:29:01 +09:30
coolGi ab62c62079 Fixed values being able to go over number limit 2023-07-17 00:27:32 +09:30
James Seibel dacf573548 Update coreSubProjects 2023-07-16 09:29:40 -05:00
James Seibel 11baa7956d Hopefully fix massive CPU use when world gen is enabled 2023-07-15 18:22:01 -05:00
James Seibel 88bab7736b Update coreSubProjects 2023-07-15 12:31:52 -05:00
James Seibel cf5dcb63d1 Fix RenderSourceFileHandler threadPools not closing
Closes #543 (slowdown when moving between dimensions)
2023-07-15 11:50:59 -05:00
James Seibel fe92203201 Update coreSubProjects 2023-07-15 08:51:26 -05:00
James Seibel e9c2a6e0e4 Fix debug Renderer Mode localization 2023-07-14 07:03:18 -05:00
James Seibel 21f665c941 Make preprocessors exclusive by default and add inclusive options
This was done since previously the POST processors were inclusive but the PRE processors were exclusive, which is confusing.
2023-07-11 21:33:55 -05:00
James Seibel c9c96ff2e8 Fix 1.20.1 compiling 2023-07-11 19:53:08 -05:00
James Seibel 1e8964a162 Fix pointing to the wrong core sub-module 2023-07-11 19:41:44 -05:00
James Seibel e5cbcf2614 Update coreSubProjects 2023-07-11 19:02:21 -05:00
James Seibel 995f30b7e2 Merge branch 'minecraft-lod-mod-main' 2023-07-11 18:52:11 -05:00
James Seibel 64e0f9b48f refactoring 2023-07-11 08:50:32 -05:00
James Seibel db7001dd6f Fix option and changelog button missing backgrounds 2023-07-10 20:43:30 -05:00
James Seibel d70de5dac6 Fix forge running in the IDE 2023-07-08 11:55:15 -05:00
James Seibel 0a45192030 remove unused imports 2023-07-08 11:53:29 -05:00
s809 bdda96854e Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-07-08 16:23:17 +05:00
s809 638e7c19a3 Update core 2023-07-08 12:25:39 +05:00
James Seibel cedb63a505 Fix 1.19 and 1.20 compiling 2023-07-07 07:55:01 -05:00
coolGi 84941639ff Merge branch 'buildAll_windows' into 'main'
Update buildAll.bat

See merge request jeseibel/minecraft-lod-mod!30
2023-07-07 08:16:37 +00:00
Dominik Marcinowski cb8e4231a5 Update buildAll.bat 2023-07-07 08:03:00 +00:00
James Seibel 447759304a Add experimental Seamless Overdraw option 2023-07-06 22:17:05 -05:00
s809 0b8f57a952 Update core 2023-07-06 21:57:19 +05:00
s809 5808179abb Outline what interaction should somewhat look like
(not an actual interaction)
Fix client repeatedly registering handlers on reconnects
2023-07-06 21:57:02 +05:00
James Seibel 87f3a718b4 Refactoring 2023-07-04 15:41:22 -05:00
James Seibel 6c79c6b1ff Merge branch 'minecraft-lod-mod-serverCommunication' 2023-07-04 13:43:08 -05:00
James Seibel 889daecc86 refactor and rename 2023-07-04 10:29:43 -05:00
Cailin Smith 10de377081 Somehow missed this 2023-07-03 23:27:46 +02:00
James Seibel 310b237b7d Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-07-03 06:50:34 -05:00
James Seibel e71727c6f9 Update coreSubProjects 2023-07-03 06:50:21 -05:00
Cailin Smith 213d7a30b4 Rename class 2023-07-02 22:35:02 +02:00
Cailin Smith bc1a0123b2 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-07-02 22:10:05 +02:00
Cailin Smith b3c4c790dc Add ability for servers to communicate with the client to set the world.
This prevents the client from accidentally selected the wrong world
folder to load LODs from, since levels of the same dimension can't
naturally be distinguished from each other. With level similarity
detection, this can sometimes work, but in general is not reliable. This
mechanism instead allows servers to send a packet to the client on load,
enabling the override system, and then a second packet on world change,
which specifically sets the world key, based on knowledge that only the
server has, leading to a reliable way of detecting the correct world.
2023-07-02 21:46:34 +02:00
Cailin Smith d96c96fc6e Add ability for servers to communicate with the client to set the world.
This prevents the client from accidentally selected the wrong world
folder to load LODs from, since levels of the same dimension can't
naturally be distinguished from each other. With level similarity
detection, this can sometimes work, but in general is not reliable. This
mechanism instead allows servers to send a packet to the client on load,
enabling the override system, and then a second packet on world change,
which specifically sets the world key, based on knowledge that only the
server has, leading to a reliable way of detecting the correct world.
2023-07-02 21:27:06 +02:00
TomTheFurry 79513b6c52 Fix build issues 2023-07-02 18:33:28 +08:00
TomTheFurry 6fca33e496 Fix a crash on game startup, and fix world gen compat with TFC (TerraFirmaCraft) 2023-07-02 18:32:15 +08:00
s809 0184396b6a Update core 2023-06-30 22:05:40 +05:00
s809 47963fba43 The real server side
(not tested)
2023-06-30 22:05:03 +05:00
James Seibel cd95405c6a update chunk wrapper docs 2023-06-30 07:32:53 -05:00
James Seibel 3936b63580 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-06-29 20:58:01 -05:00
James Seibel c1c4a91bbf add api version and CI building 2023-06-29 20:56:40 -05:00
TomTheFurry 51b93a7e3f Prob fix the gl error? (might add mem leak tho.) & fix 1.18.2 build 2023-06-29 21:40:25 +05:00
TomTheFurry bde11b5950 Trash remaining 1.19 & 1.18.1 unsupported mc version, and fixup 1.19.2 2023-06-29 21:40:25 +05:00
James Seibel 3aab0469ab Set the javadoc's title to their project names
In this case "DistantHorizons-api"
2023-06-29 21:40:25 +05:00
James Seibel dd2c9d1e56 Fix javadoc landing page 2023-06-29 21:40:25 +05:00
James Seibel 4dbae72eae JavaDoc API auto deploy attempt 2
(Fix typo)
2023-06-29 21:40:25 +05:00
James Seibel 2aac43485a JavaDoc API auto deploy attempt 2023-06-29 21:40:25 +05:00
James Seibel 6aa94d1ec5 add build_api_docs to the CI 2023-06-29 21:40:25 +05:00
James Seibel a9b1ca888a re-add horizontal micro-offset in vertex shader 2023-06-29 21:40:19 +05:00
TomTheFurry 6477408858 Prob fix the gl error? (might add mem leak tho.) & fix 1.18.2 build 2023-06-29 16:27:42 +08:00
TomTheFurry 1b66672166 Trash remaining 1.19 & 1.18.1 unsupported mc version, and fixup 1.19.2 2023-06-29 16:04:20 +08:00
James Seibel 207d5cb949 Update coreSubProjects 2023-06-28 18:17:33 -05:00
s809 3b90855781 Update core 2023-06-28 23:09:22 +05:00
s809 61c4b50528 Some changes to stop server from crashing on startup 2023-06-28 23:08:09 +05:00
James Seibel 38085c3e7d Set the javadoc's title to their project names
In this case "DistantHorizons-api"
2023-06-26 21:26:42 -05:00
James Seibel a16099bc98 Fix javadoc landing page 2023-06-27 01:36:36 +00:00
James Seibel 0342b4b5a9 JavaDoc API auto deploy attempt 2
(Fix typo)
2023-06-27 01:27:06 +00:00
James Seibel 9be222f25f JavaDoc API auto deploy attempt 2023-06-27 01:20:56 +00:00
James Seibel 5e242561bd add build_api_docs to the CI 2023-06-26 19:26:22 -05:00
s809 014b49246d Clean up a bit and add netty to core 2023-06-26 21:16:39 +05:00
James Seibel d57192f76a Update coreSubProjects 2023-06-26 21:16:39 +05:00
TomTheFurry a52c286241 Ops. 2023-06-26 21:16:39 +05:00
TomTheFurry 16bcf30092 Add in 1.20.1 builds! But, sky light for world gen isn't working...? 2023-06-26 21:16:39 +05:00
coolGi b2ba94f6e5 Added clean to the ci 2023-06-26 21:16:39 +05:00
TomTheFurry 7d8ab781cb Optimization on load time, fix gl bug, and improve transparency 2023-06-26 23:20:02 +08:00
James Seibel 52f52b1c1b re-add horizontal micro-offset in vertex shader 2023-06-26 07:59:01 -05:00
s809 9a5ebce51e Fork core 2023-06-26 16:16:31 +05:00
James Seibel 960488bef4 Update coreSubProjects 2023-06-25 18:50:53 -05:00
TomTheFurry 318d514b41 Ops. 2023-06-25 14:58:50 +08:00
TomTheFurry 01f767486d Add in 1.20.1 builds! But, sky light for world gen isn't working...? 2023-06-25 14:56:50 +08:00
coolGi eba2036718 Added clean to the ci 2023-06-25 00:01:37 +00:00
s809 f9a7aa3c62 Not even working 2023-06-24 22:26:58 +05:00
TomTheFurry 064c69d66c Fix up 1.18.2 builds 2023-06-24 23:13:53 +08:00
TomTheFurry 1ef2084e3b Fix a missing stuff in forge 2023-06-24 22:49:34 +08:00
TomTheFurry 0396c5e384 CI for 1.19.4??? 2023-06-24 22:43:07 +08:00
TomTheFurry a02fb42490 1.19 is back up and running! (A few... bugs though) 2023-06-24 22:41:19 +08:00
coolGi b82d9d6d9a Updated core submodule 2023-06-24 23:20:27 +09:30
TomTheFurry e2855e8984 Start to cleanup and work on 1.19 2023-06-24 19:30:25 +08:00
James Seibel 2bbf081f99 Overhaul Dh API event definition system 2023-06-23 23:07:48 -05:00
TomTheFurry f4784840fd Greatly improve Gen queue stability & improve loading times and performance 2023-06-24 00:24:27 +08:00
James Seibel 3464341c04 Update coreSubProjects 2023-06-22 21:37:05 -05:00
James Seibel ff16a97ce8 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-06-22 07:57:24 -05:00
James Seibel 56c666ead8 Add AbstractDhApiChunkWorldGenerator 2023-06-22 07:57:14 -05:00
coolGi 12ef1f30f1 Fixed missing fullstop in readme 2023-06-21 14:27:40 +00:00
James Seibel 5d7abd5f70 Make WrapperFactory compiling fail if not implemented for current MC version 2023-06-21 07:58:06 -05:00
James Seibel 047dc0d4f5 Update coreSubProjects 2023-06-21 07:30:36 -05:00
coolGi a1f9fdc715 Fixed tooltips for linked tooltips 2023-06-21 19:52:26 +09:30
coolGi 4554052471 Fixed a broken lang in the config 2023-06-21 19:46:41 +09:30
coolGi 17762a9e49 Updated core submodule 2023-06-21 19:40:42 +09:30
James Seibel bdfc053596 API event exception fix 2023-06-20 20:55:35 -05:00
TomTheFurry 68e93ac19a Fixed up last of the bugs 2023-06-20 19:04:34 +08:00
James Seibel bdd01eef2b Update coreSubProjects 2023-06-19 22:04:15 -05:00
James Seibel fc68645ba3 Update coreSubProjects 2023-06-19 21:42:05 -05:00
James Seibel 4c2d1458de Fix config default thread counts being 0 2023-06-19 20:41:04 -05:00
coolGi 5f51cb11fe Forgot to turn down default noise intensity 2023-06-20 00:03:56 +09:30
coolGi 661aa37d71 Updated core submodule 2023-06-20 00:02:03 +09:30
coolGi 7756bd4fa1 Fixed removing unused files form jar 2023-06-19 23:07:17 +09:30
TomTheFurry 19daa14f94 Update core 2023-06-19 14:41:36 +08:00
James Seibel afbb0e05aa Update coreSubProjects 2023-06-18 08:51:17 -05:00
James Seibel 1de329ed9b Fix some config setup not running if the UI isn't opened 2023-06-17 21:53:22 -05:00
James Seibel 5915bb1f70 Update coreSubProjects 2023-06-17 21:03:46 -05:00
James Seibel 38c368d9fe rename namespace lod -> distanthorizons 2023-06-17 17:45:38 -05:00
James Seibel 637a8cfe65 rename IDhApiUnsafeWrapper method 2023-06-17 16:52:27 -05:00
TomTheFurry ef47e1d85d Merge remote-tracking branch 'origin/main' 2023-06-18 00:27:29 +08:00
TomTheFurry 97f19915bd Refactor the DhLevel class structure.
Note: Known issue where sections need reload before gen is queued up. Will fix next
2023-06-18 00:24:12 +08:00
TomTheFurry a487653444 Refactor the DhLevel class structure.
Note: Known issue where sections need reload before gen is queued up. Will fix next
2023-06-18 00:23:51 +08:00
coolGi b649b1c279 Updated readme 2023-06-17 14:49:51 +09:30
coolGi 1a0f1244fa Fixed 1.19, 1.19.2, and 1.19.4 compile properties 2023-06-17 14:07:05 +09:30
TomTheFurry 67612e1e92 Update core 2023-06-17 01:01:00 +08:00
TomTheFurry 650c4b30a5 First baby step towards a pre-lod-loader. 2023-06-17 01:00:34 +08:00
TomTheFurry 3be9848da3 Update core 2023-06-16 23:37:29 +08:00
TomTheFurry d339a86b92 Quick fix debug chat msg crashing the game 2023-06-16 23:37:11 +08:00
James Seibel 64d6e2ea55 Update coreSubProjects 2023-06-15 07:42:34 -05:00
coolGi 77a5906ee5 Merge remote-tracking branch 'origin/main' 2023-06-15 18:30:26 +09:30
coolGi ff0547f2b9 Updated more mod versions 2023-06-15 18:28:51 +09:30
TomTheFurry b9aa2e1cca Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
2023-06-15 16:42:07 +08:00
TomTheFurry 7624764ee0 Fix lighting issues in both client-only and single player world 2023-06-15 16:41:18 +08:00
coolGi 08d15f7728 Disabled immersive portals compat as it doesnt fully work 2023-06-15 17:57:22 +09:30
coolGi ebd6aa0d74 Updated mod and loader versions 2023-06-15 17:55:38 +09:30
coolGi 1b84d8bf0b Updated gradle script to be easier to add loaders 2023-06-15 17:41:18 +09:30
James Seibel 2b1b54a646 config renaming and add new configs to DhApi 2023-06-14 21:32:21 -05:00
James Seibel a65dc83721 Update James' contact in the code_of_conduct 2023-06-14 20:18:07 -05:00
James Seibel 78c6fea352 Add LZ4 to the readme 2023-06-14 20:17:48 -05:00
James Seibel 03da6d87b5 Update coreSubProjects 2023-06-14 19:43:04 -05:00
James Seibel e0e6ac402e Implement the Quick enable render toggle
Also improve the logic for setting UI only config values
2023-06-12 22:19:11 -05:00
James Seibel 288459c88b Allow skipping config enums 2023-06-12 20:24:56 -05:00
coolGi fe41d03437 Updated core subproject 2023-06-12 20:19:13 +09:30
coolGi 940933eff4 Merge branch 'detached' into 'main'
Screen Space Ambient Occlusion

See merge request jeseibel/minecraft-lod-mod!28
2023-06-12 10:48:06 +00:00
notalpha e45b479ae3 feat: SSAO 2023-06-12 11:37:18 +02:00
TomTheFurry d3ec5a9ac2 Update core 2023-06-12 13:26:10 +08:00
James Seibel 7d20354ba5 rename config extendedNearClip -> overdrawPrevention 2023-06-11 22:16:48 -05:00
James Seibel 12548099f1 Fix BlockToAvoid and TintWithAvoidedBlocks 2023-06-11 21:24:38 -05:00
James Seibel 643c66a12f Update coreSubProjects 2023-06-11 18:03:55 -05:00
James Seibel da719b4a7e Update coreSubProjects 2023-06-11 15:57:53 -05:00
TomTheFurry 2a3ae34294 Fix (well, lower the chance of) reading regions that is actively being saved, reduce that chunk pos error chance. 2023-06-11 19:52:59 +08:00
TomTheFurry 27f7440165 update core 2023-06-11 18:32:42 +08:00
TomTheFurry 73ff60a0f6 Update manifold version so it stop spamming complaints 2023-06-11 18:31:50 +08:00
James Seibel a80843ce77 Update the config lang file
Also rename and refactor a few items
2023-06-09 22:10:43 -05:00
coolGi 4a9dc216e7 Updated lang generator to whitelist linked options 2023-06-08 23:06:48 +09:30
James Seibel 72c9de354e Overhaul the config and start adding summary options
also:
- add DH vs MC lighting engine option
- add a toggle for wireframe rendering
2023-06-07 22:59:49 -05:00
coolGi ae269b3a74 Updated core submodule 2023-06-06 19:06:14 +09:30
coolGi f3bc22cdc8 Added linking config options 2023-06-06 19:06:04 +09:30
coolGi 92cc8bf6f6 Updated core submodule 2023-06-06 18:02:35 +09:30
coolGi 05b6e74482 Fixed and checked support for all available config types 2023-06-06 18:01:49 +09:30
James Seibel 90fb950fc3 rename LodThreadFactory -> DhThreadFactory 2023-06-05 20:02:50 -05:00
James Seibel 005f1ed8a0 Move the world gen thread pool into the WorldGenQueue
We want Core to handle the world gen threads, not the individual world generators
2023-06-05 19:50:32 -05:00
James Seibel bb4497dd80 fix config listener onValueSet and add ConfigChangeListener 2023-06-04 22:05:17 -05:00
James Seibel 8956bc4980 Revert "remove ClassicConfigGUI.setWithoutSaving()"
This reverts commit 0a91473402.
2023-06-04 21:41:37 -05:00
James Seibel 0a91473402 remove ClassicConfigGUI.setWithoutSaving() 2023-06-04 21:07:54 -05:00
James Seibel 4df12e7316 add missing thread configs 2023-06-03 22:29:58 -05:00
James Seibel 3ff4e0f9a6 World generator reformatting 2023-06-03 21:37:12 -05:00
coolGi 6c5b1501e9 Updated core submodule 2023-06-03 21:40:04 +09:30
coolGi c1fddd1b82 Added a comment to add DimensionWrapper (maybe to replace DimensionTypeWrapper) 2023-06-03 21:39:47 +09:30
coolGi 256e3a1dbb Checked dimension instead of the dimension type 2023-06-03 21:32:59 +09:30
coolGi 2fbc69cb34 Updated log4j version 2023-06-03 21:00:37 +09:30
coolGi d3a06b8597 Fixed merged jars and added it to the ci 2023-06-02 23:32:12 +09:30
coolGi 9d9370f2f5 Moved version for lz4 to gradle.properties 2023-06-02 23:09:21 +09:30
coolGi aa6ae3084e Merge remote-tracking branch 'origin/main' 2023-06-02 22:38:50 +09:30
coolGi 9bd66aa54b FORGE FINALLY WORKS!!!! Server Load event called too late, and duplicate Client level load events. 2023-06-02 22:38:44 +09:30
TomTheFurry c33c0a4acb Fix the chunk loading by using an alternative method. It works very nicely now! 2023-06-01 19:22:27 +08:00
James Seibel fc9ce8243a Add a basic lighting engine for generated chunks 2023-05-29 19:44:56 -05:00
James Seibel ddf8950cc0 add BatchGenerationEnvironment warn comment 2023-05-29 14:10:15 -05:00
James Seibel f2832a0fd6 (hopefully) improve world gen shutdown time 2023-05-27 13:42:28 -05:00
coolGi 4660c4d5bf Merge remote-tracking branch 'origin/main' 2023-05-22 23:51:27 +09:30
coolGi 1b60c66eec Only use the Modrinth api if the user clicks the changelog menu instead of when the config is opened 2023-05-22 23:51:19 +09:30
James Seibel ac939a5e95 drop fixed thread pools to 1 for easier testing 2023-05-22 07:49:46 -05:00
James Seibel ea0a98c9f0 Fix a crash if transparency is disabled 2023-05-22 07:18:21 -05:00
James Seibel baa11f481e improve a couple batch generator error messages 2023-05-21 18:41:48 -05:00
James Seibel 1cbb124ba0 fix unit tests and add data compression 2023-05-21 17:47:51 -05:00
coolGi 883685de83 Updated core submodule 2023-05-21 20:40:12 +09:30
coolGi 91864443d5 Made the changelog screen look a bit nicer 2023-05-21 20:36:01 +09:30
coolGi b48d6bfd4b Added changelog button to the config menu 2023-05-21 20:18:25 +09:30
coolGi a1ede75450 Fixed up the lz4 compression location in jar 2023-05-21 20:00:59 +09:30
James Seibel db73aaeabb add LZ4 for compression 2023-05-20 11:44:39 -05:00
James Seibel 284690338c ForgeServerProxy minor reformat 2023-05-19 22:42:15 -05:00
James Seibel 550a1a44ef Update coreSubProjects 2023-05-13 11:08:26 -05:00
James Seibel 5203c03257 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-05-12 22:15:03 -05:00
James Seibel 1a9f56c03e Update coreSubProjects 2023-05-12 22:14:48 -05:00
coolGi 3cf0c724f4 Added a fixme comment 2023-05-12 20:45:40 +09:30
coolGi 3e96b01981 Reverted the MixinFogRenderer to fix fog not disabling 2023-05-12 19:09:28 +09:30
coolGi 59658441ff Made the MixinUtilBackgroundThread slightly easier to deal with 2023-05-12 19:04:28 +09:30
coolGi a4e20114a7 Updated forge's mixins 2023-05-12 19:02:32 +09:30
coolGi aa1315dd57 Moved the modAccessors to the wrappers folder on forge 2023-05-12 18:47:49 +09:30
coolGi 271149baa4 Made several Subscribed Events public 2023-05-12 18:43:54 +09:30
James Seibel 680f6dc317 Update coreSubProjects 2023-05-06 19:40:14 -05:00
coolGi 0e6282e90e Updated core submodule 2023-05-07 08:55:48 +09:30
coolGi e9f66dc091 Removed getFogColor from the BCLibAccessor 2023-05-07 08:55:10 +09:30
coolGi 88f6acb618 Generalised the fog fix 2023-05-07 08:48:03 +09:30
coolGi 6f36cd3305 Fixed up gradle to be able to not run immersive portals 2023-05-07 08:32:46 +09:30
coolGi b476da8ba4 Worked more on immersive portals compatibility 2023-05-06 23:04:56 +09:30
coolGi 873187e210 Hard-coded the authors in mods.toml to fix architectury error 2023-05-06 13:04:11 +09:30
James Seibel 5ec21065cc Create new world gen tasks when moving into new areas 2023-05-04 07:31:56 -05:00
James Seibel dbdbb14bac Fix renderSection flickering 2023-05-02 19:46:34 -05:00
coolGi 2cbc98a26a Removed quotations around authors in mod infos 2023-05-02 23:21:40 +09:30
coolGi 5739eb9a85 Started work on adding immersive portal support 2023-05-02 23:21:09 +09:30
coolGi f6887ee7d5 Merge remote-tracking branch 'origin/main' 2023-05-02 22:28:54 +09:30
James Seibel 12698c5d39 rename lod.core.api -> lod.coreapi.api to file compiler issues 2023-05-02 07:33:27 -05:00
James Seibel 8244932247 temporary fabric/mod.json and forge/mods.toml author fix 2023-05-02 07:32:10 -05:00
Ran 39ef896138 Made forge actually run! Renamed com.seibel.lod.core to com.seibel.lod.coreapi 2023-05-01 19:27:52 +06:00
coolGi 258a2a8ee7 Updated core submodule 2023-05-01 15:15:10 +09:30
James Seibel 0b570ba15d Update coreSubProjects 2023-04-30 21:52:37 -05:00
James Seibel 7d4e6e59d9 Update coreSubProjects 2023-04-30 21:30:02 -05:00
coolGi 9c543e2ec8 Updated forge version 2023-05-01 02:38:32 +09:30
coolGi d9ef9282ad Renamed some comments on the root build.gradle 2023-05-01 00:57:00 +09:30
coolGi 5c1058ca76 Moved fabric loom back to its own build.gradle 2023-05-01 00:52:41 +09:30
Ran c30cb1c04d Forge runs! With a thousand errors... 2023-04-30 14:41:04 +06:00
Ran 5caf11789f Try to fix Forge 2023-04-30 14:15:04 +06:00
coolGi ef02856b45 Removed fabricLike and quilt from the main branch. Development moved to the common_mixins branch. 2023-04-29 23:18:48 +09:30
James Seibel 077e25d7a8 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-04-27 20:36:13 -05:00
James Seibel ef84fe97d5 Fix typos, merge WorldGenStep enum, and update Core 2023-04-27 20:35:10 -05:00
coolGi fc3653e577 Started work on fixing the common mixin 2023-04-26 22:28:28 +09:30
coolGi d708867c74 Updated quilt and fixed up some issues related to it 2023-04-26 20:17:16 +09:30
James Seibel e6273fa6a4 Fix RenderSection overlap and holes 2023-04-17 21:41:03 -05:00
coolGi d517279ca2 Added TODO to remove the fabriclike submodule once forge can be properly tested (and fixed) 2023-04-15 01:43:37 +09:30
coolGi 71284c3e98 Started work on native Quilt support 2023-04-15 01:39:37 +09:30
coolGi 85c7dbaf99 Fixed duplicate dependency in the fabric.mod.json 2023-04-15 01:38:38 +09:30
coolGi 7cc21a2b8e Deprecated getGameDirectory from IMinecraftClientWrapper. Use IMinecraftSharedWrapper.getInstallationDirectory() instead. 2023-04-15 01:36:54 +09:30
coolGi 2c8d8e2b2e Moved items not fabric dependant away from fabric 2023-04-11 01:08:01 +09:30
coolGi d366da4947 Moved items not fabric dependant away from fabric 2023-04-11 01:07:53 +09:30
coolGi 02490440ec Disabled lodBias by default 2023-04-11 00:13:25 +09:30
James Seibel 019ec0e55d Replace QuadTree/Node Consumers with Iterators
This drastically improves debugging, because lambda consumers cause the stack trace to become messy very quickly.

Although they are unfortunately a bit more complicated to deal with and I'm less certain they are bug-free (even with the included unit tests).
2023-04-03 21:35:09 -05:00
coolGi c8ef38da3c Updated core subproject 2023-03-31 19:47:50 +10:30
coolGi b449072a69 Reverted back to using swing for the base run jar 2023-03-31 19:47:32 +10:30
James Seibel 35fde21098 Fix holes when moving around the world 2023-03-30 07:26:48 -05:00
coolGi 10bad0bc84 Fixed building 2023-03-28 20:49:55 +10:30
James Seibel 27492ba093 Temporary solution for corners not rendering 2023-03-27 21:20:38 -05:00
coolGi ed6576df4b Forgot to revert screen type back to classic 2023-03-26 18:14:13 +10:30
coolGi 1c89f9e88a Updated core submodule 2023-03-26 17:54:31 +10:30
coolGi 9cdd7fc687 Fixed up some things to do with the Java screen 2023-03-26 17:31:53 +10:30
coolGi 3a5485ea56 Moved OS getting utils to its own Platform enum. 2023-03-26 16:03:02 +10:30
coolGi 955d1df400 Fixed common trying to shadow common 2023-03-26 16:01:52 +10:30
James Seibel d39000fa56 Fix render sections incorrectly disabling/enabling when moving 2023-03-25 18:49:16 -05:00
James Seibel 231e98efb8 Fix moving causing the renderer to lock up
However LODs aren't unloaded correctly after moving and corners aren't rendered correctly either
2023-03-25 16:19:17 -05:00
James Seibel 87299de2ab Add a mostly functional QuadTree data structure and unit tests 2023-03-23 07:25:37 -05:00
coolGi 33c9b48bc9 Relocated the lwjgl libary 2023-03-23 19:54:45 +10:30
coolGi 416208c33a New ui frame now shows 2023-03-23 19:25:33 +10:30
coolGi 7bba8d2862 Sava commit for the new Config UI 2023-03-23 18:08:36 +10:30
coolGi 8b22349d0f Updated logo svg so they can be defined in variables 2023-03-18 12:30:33 +10:30
coolGi cd156630a8 Slightly fixed up the mixin plugin 2023-03-17 22:36:22 +10:30
coolGi 769d5739b8 Updated core subproject 2023-03-17 22:29:44 +10:30
coolGi 6d29f58ebd Fixed up more things to do with JavaFX, and added some extra stuff for the MinecraftScreen 2023-03-17 22:29:28 +10:30
coolGi 2d8027cd28 Removed FlatLaf (which was used for theming) and replaced it with JavaFX 2023-03-17 19:45:18 +10:30
coolGi be9547612d Added some gradle settings to make it hopefully run slightly faster 2023-03-17 18:21:04 +10:30
James Seibel 67f8ff841d improve error logging 2023-03-16 07:55:41 -05:00
James Seibel 51a7ccc8d0 update world gen queue logic and comments 2023-03-16 07:26:25 -05:00
James Seibel 3fdaa42206 Make world gen task queuing async 2023-03-14 22:12:10 -05:00
James Seibel 70c783194f Fix the world generator only going to detail level 3 2023-03-14 22:03:58 -05:00
James Seibel aec1d2bbe8 add StepStructure retry logic 2023-03-14 21:43:59 -05:00
James Seibel cabcbef34b refactoring 2023-03-14 21:43:35 -05:00
James Seibel d952e5400b allow the world generator to generate any detail level 2023-03-14 07:31:35 -05:00
James Seibel eba908c153 start adding new world generator (may be broken) 2023-03-13 07:25:26 -05:00
James Seibel 65feda4e04 prefix "DH-" to the batch generator threads 2023-03-11 12:03:02 -06:00
James Seibel 81e636b1c6 Fix file writing 2023-03-10 22:49:23 -06:00
James Seibel 4c4861b2e3 refactor BatchGenerationEnvironment 2023-03-10 22:01:08 -06:00
James Seibel 28972421ad drastically improve file reading/writing speed
see e5116e1ec99ad3f0c690e2c63eef998d9dc1ef78 and dd8ee36487f2936e2aa9ba48c549ca92678a7adb
2023-03-09 21:44:24 -06:00
James Seibel 3619acbd54 Update coreSubProjects 2023-03-09 21:03:00 -06:00
James Seibel c539f1eeef Update coreSubProjects 2023-03-07 20:39:11 -06:00
James Seibel 23cf213200 Remove deprecated LodConfigWrapperSingleton 2023-03-06 20:40:12 -06:00
James Seibel a371c6b364 Update coreSubProjects 2023-03-05 18:38:10 -06:00
James Seibel d1e58ccf28 Refactor GenerationEvent 2023-03-05 18:17:00 -06:00
James Seibel 0062a28504 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-03-04 20:07:03 -06:00
coolGi 9d00a1eb67 Updated core 2023-03-05 12:13:49 +10:30
coolGi 7e75640263 Updated core 2023-03-05 11:59:18 +10:30
coolGi 32f1cfa634 Notification in the config if there is going to be an update on close 2023-03-05 11:57:56 +10:30
coolGi aed5f54710 Minor refactor to the screen 2023-03-05 11:41:40 +10:30
James Seibel 267fa4acfa Fix ChunkWrapper isLightCorrect() for both singlePlayer and servers 2023-03-04 14:26:08 -06:00
coolGi a4f731da16 Forgot to remove the exclude comment in the ci 2023-03-04 09:51:00 +00:00
coolGi 8ee9c42848 Fixed ci to work with the new files 2023-03-04 18:55:06 +10:30
coolGi a43335466c Fixed the remapJar is the correct file 2023-03-04 18:53:43 +10:30
coolGi 1a0b86d056 Fixed jarLocations for forgix & properly set jar name 2023-03-04 18:53:28 +10:30
James Seibel d96cc5c74b Fix client-only chunks not returning isLightCorrect() correctly
This is specific to MC 1.18.2 and may need expanding for other MC versions
2023-03-02 21:35:28 -06:00
James Seibel 54faa2cbdc Fix ClientLevelWrapper.tryGetServerSideWrapper() failing when changing dimensions 2023-03-02 20:45:40 -06:00
James Seibel e7e25cb5b7 Update coreSubProjects 2023-03-02 07:50:38 -06:00
James Seibel b4afb2f495 Update coreSubProjects 2023-03-01 07:31:44 -06:00
James Seibel 2a5e67a461 prevent null pointers in McClientWrapper getWrappedClientWorld() 2023-02-28 22:06:43 -06:00
coolGi a71dd0b3b8 Update gitlab-ci to maybe give working jar 2023-02-28 21:14:44 +00:00
James Seibel b2d9c2eec6 Remove duplicate test command in CI
the "build" command both runs tests and assembles the code
2023-02-28 07:39:05 -06:00
James Seibel 518262c515 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2023-02-28 07:28:48 -06:00
James Seibel 1de5983260 Fix CI not pulling core when building 2023-02-28 07:28:25 -06:00
coolGi 3c5b1eb423 Updated core subproject and fixed readme for core 2023-02-28 16:58:33 +10:30
coolGi 4d195a6378 Cleaned up some shadow code 2023-02-28 16:54:43 +10:30
James Seibel cdbfad060b Fix gradle mystery compiler error
Specifically fixes core gradle being unable to access packages found in API
2023-02-27 20:41:45 -06:00
coolGi e9eeba944a Cleaned some stuff on the gradle 2023-02-27 22:32:47 +10:30
coolGi 3c111cd8d6 Updated core 2023-02-27 21:12:08 +10:30
coolGi 68c5362024 Updated readme 2023-02-27 15:01:22 +10:30
coolGi 40ea294663 Updated modmenu to the latest version 2023-02-27 15:00:57 +10:30
James Seibel 1b2afcd02c Add fabric block break/place events 2023-02-26 16:39:00 -06:00
James Seibel 6c5eb09486 Move shared Dh(Server)ClientLevel code into AbstractDhClientLevel 2023-02-25 21:35:00 -06:00
James Seibel 221d011b48 reformat 2023-02-25 21:33:54 -06:00
James Seibel ad36204dfb Fix ClientApi.onClientOnlyDisconnected() and and Connected() not being called 2023-02-25 15:29:46 -06:00
James Seibel 70f8599a0e refactor fabric methods 2023-02-25 14:30:08 -06:00
James Seibel 211ec7f3a6 Hard shutdown the world generator, don't wait 2023-02-25 10:23:18 -06:00
James Seibel 43a75df119 Improve the issue templates 2023-02-25 09:25:00 -06:00
coolGi 679c6791c7 Temporary disabled manifold on forge, and some more attempts at trying to fix forge+manifold 2023-02-25 22:33:22 +10:30
coolGi 033616db7a Quick fix so it can build 2023-02-25 20:56:58 +10:30
coolGi 1a09edd8bb Forge now nearly works, it just dosent have a preprocessor 2023-02-24 21:35:50 +10:30
coolGi 0ff7a5cd11 Set manifold to always use the latest version 2023-02-24 20:47:02 +10:30
coolGi 4e0574af35 Forge now build but dosent run 2023-02-24 20:44:41 +10:30
coolGi 027dbf35f8 Forge finally fixed. Altough manifold is disabled in forge atm 2023-02-24 19:55:45 +10:30
coolGi a9dc1e232a Updated core 2023-02-24 19:10:23 +10:30
coolGi f50cfab3f7 Commented, updated, downgraded forge stuff but still to no avail 2023-02-24 19:10:11 +10:30
coolGi 981d9a095d Removed classifier's as they are no longer needed in gradle 18 2023-02-24 19:08:53 +10:30
James Seibel d1670673f2 Update coreSubProjects 2023-02-23 20:19:27 -06:00
James Seibel 82fa375afc make Core compile with Java 8 2023-02-23 19:53:21 -06:00
James Seibel 95d0765ccb convert several files to Java 8
There may be additional files that require changing
2023-02-23 19:52:51 -06:00
James Seibel 8f9524a319 Revert "Fix exceptions when closing a world"
This reverts commit a680aa97d2.
2023-02-21 22:10:33 -06:00
James Seibel a680aa97d2 Fix exceptions when closing a world 2023-02-21 21:25:17 -06:00
coolGi 7ca0092501 Set remap to false in the MixinTextureUtil to fix warning 2023-02-20 17:12:03 +10:30
James Seibel 4d7321941c Update coreSubProjects 2023-02-19 17:48:24 -06:00
coolGi 8d1c5e4b5b Merge remote-tracking branch 'origin/main' 2023-02-19 21:39:05 +10:30
coolGi 1ebcd49601 Added quilt support to the ci 2023-02-19 21:38:52 +10:30
coolGi 9ac7753f04 builds_for variable in the version.properties now works and moved the version.properties loading to settings.gradle 2023-02-19 21:38:52 +10:30
James Seibel 7ca81fe281 Update coreSubProjects 2023-02-18 08:56:28 -06:00
James Seibel 1b5762a133 Merge 2023-02-18 07:23:21 -06:00
coolGi e373969b34 Added ability to change vanilla's lod bias 2023-02-18 20:00:54 +10:30
James Seibel f16472c415 rename serverApi.serverLoad/Unload event methods 2023-02-17 08:33:49 -06:00
coolGi 72169f271f Updated core 2023-02-15 17:19:00 +10:30
coolGi b1149bda39 Updated mod version 2023-02-15 17:17:41 +10:30
coolGi 8f838891cb Merge remote-tracking branch 'origin/new_buildsystem'
# Conflicts:
#	coreSubProjects
#	gradle.properties
2023-02-15 17:07:41 +10:30
cola98765 e4518cafeb let's start slow. fixed some typos 2023-02-14 13:23:10 +01:00
coolGi 6022161e0c Fixed exclude code 2023-02-14 18:59:44 +10:30
coolGi dd8b695cdf Slightly changed the CI to use exclude to exclude non-main jars and added forge to it 2023-02-14 18:57:15 +10:30
coolGi e896be7324 Temporary fix for gitlab ci for old build system 2023-02-14 18:30:23 +10:30
James Seibel 06298418cb up the version number from 1.7.0 -> 2.0.0 2023-02-13 20:27:11 -06:00
James Seibel fdcbbae3b1 minor blockStateWrapper reformat 2023-02-13 20:27:06 -06:00
coolGi a719ec5a3e Added some more stuff to attempt to fix forge 2023-02-13 19:07:50 +10:30
coolGi 55bf0c04f4 Added temporary accesstransformer 2023-02-13 18:17:53 +10:30
coolGi 666293f59d Merge remote-tracking branch 'origin/main' into new_buildsystem
# Conflicts:
#	build.gradle
#	forge/build.gradle
#	versionProperties/1.18.2.properties
2023-02-13 18:11:43 +10:30
coolGi 4442fda70a Did the bear minimum to make forge "work" so we can do testing on the new build system 2023-02-13 18:10:27 +10:30
coolGi cf976cef84 Fixed double quotes from last push 2023-02-12 22:21:01 +10:30
coolGi e2dcbf48af Made jar size around 1.5 MB smaller by removing an unused dependency 2023-02-12 22:19:36 +10:30
coolGi 79ba86d8c2 New Build system now works as good as the old build system (forge still broken) 2023-02-12 20:45:57 +10:30
coolGi 8de6ca33af Fabric now builds (and works outside the build environment) 2023-02-12 20:11:53 +10:30
coolGi 89faf6e976 Merge remote-tracking branch 'origin/main' into new_buildsystem
# Conflicts:
#	build.gradle
#	fabric/build.gradle
2023-02-12 19:06:48 +10:30
coolGi bc5861ea95 Refactored forge stuff to be in a forge folder 2023-02-12 18:59:27 +10:30
coolGi cc3a3c451c Refactored fabric stuff to be in a fabric folder 2023-02-12 18:55:00 +10:30
coolGi f0956c0cdb Fixed fabric build 2023-02-12 13:03:25 +10:30
coolGi dcc143c9f8 Disabled Forgix 2023-02-12 12:20:33 +10:30
coolGi 56603e8076 Updated core 2023-02-07 19:34:18 +10:30
James Seibel 06922458f1 fix issue template automatic labels 2023-02-04 14:42:16 -06:00
James Seibel 17b7a6eb89 add a default issue template 2023-02-04 14:38:47 -06:00
James Seibel 52b222de50 Add issue templates (Thanks AquaticLava!) 2023-02-03 07:55:30 -06:00
James Seibel 35d45057ba Add 2 potential fixes for the optifine render resolution bug 2023-01-31 07:54:36 -06:00
coolGi 6a5ba1a607 Merge branch 'main' into 'new_buildsystem'
Put main into buildscript for updated testing

See merge request jeseibel/minecraft-lod-mod!26
2023-01-29 05:12:51 +00:00
coolGi c01c77e11d Merge branch 'new_buildsystem' into 'main'
# Conflicts:
#   gradle.properties
2023-01-29 05:11:04 +00:00
coolGi 27a01d4da3 Added most of the core dependencies, fixed fabric runClient and disabled Forge for now 2023-01-29 14:49:29 +10:30
coolGi 76f3a3cfcb Disabled stuff that requires Architectury API (so the networking) 2023-01-29 14:16:12 +10:30
coolGi 52005d0b19 Added a proper fix for when forge is attempting to be run on a different version than intended 2023-01-24 23:46:15 +10:30
coolGi af6f477f15 Updated core submodule 2023-01-24 18:14:08 +10:30
James Seibel bf2ffd6dfb Update coreSubProjects 2023-01-22 19:56:44 -06:00
James Seibel dd6380d49d rename AbstractWorldGenTaskTracker.isValid -> isMemoryAddressValid 2023-01-22 17:12:49 -06:00
James Seibel d59fc82cc7 refactor Generation Event and Environment 2023-01-15 20:03:12 -06:00
James Seibel 2f62dd2c49 Add Contributing and Code Of Conduct guidelines
As requested in merge !24
2023-01-14 10:56:55 -06:00
James Seibel 379f8911b5 update manifold 2022.1.24 -> 2022.1.33 2023-01-10 21:46:48 -06:00
James Seibel 1a72c30684 Merge branch 'JackWorks-main-patch-14514' into 'main'
Upgrade gradle to support JDK 19

See merge request jeseibel/minecraft-lod-mod!25
2023-01-11 01:25:46 +00:00
Jack Works 6891bdc34e Upgrade gradle to support Java 19 2023-01-09 04:37:29 +00:00
James Seibel c6a7e52a86 Improve the compiling instructions in the ReadMe 2023-01-08 22:12:58 -06:00
James Seibel 951ef5ed72 Update the ReadMe 2023-01-08 20:13:07 -06:00
James Seibel 20f8e59f2b Remove deprecated ChunkWrapper position getters 2023-01-02 11:19:50 -06:00
James Seibel 23b35282a9 Update Manifold 2022.1.19 -> 2022.1.24 2023-01-02 10:32:48 -06:00
James Seibel 27c3c0c404 rename EDistanceGenerationMode -> EDhApiDistantGeneratorMode 2022-12-10 22:08:33 -06:00
James Seibel df7728707a Update coreSubProjects 2022-12-10 21:53:17 -06:00
James Seibel 6bd7f54a8e Add WrapperFactory.createChunkWrapper() 2022-12-08 21:36:44 -06:00
James Seibel 954175943d Fix event related null pointer issues 2022-11-24 23:09:06 -06:00
James Seibel a1e8af623d Move Optifine code out of ReflectionHandler and into AbstractOptifineAccessor 2022-11-24 19:10:19 -06:00
James Seibel af625d912a rename DhApiEventInjector -> ApiEventInjector 2022-11-24 18:05:15 -06:00
James Seibel 04d61e81ed add IDimensionTypeWrapper.equals() 2022-11-20 20:39:57 -06:00
James Seibel 78fc6be193 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2022-11-19 19:07:34 -06:00
James Seibel 969dfa1dd0 Add isAir() to BlockStateWrapper 2022-11-19 19:06:42 -06:00
coolGi 19578f2104 pushed core 2022-11-18 19:13:00 +10:30
coolGi de60b15d2b Added the ChangelogScreen. New changelog screen done 2022-11-18 19:12:25 +10:30
coolGi 7c5ffe3f10 Core doesn't like to push itself 2022-11-17 21:46:30 +10:30
coolGi 2daf47f202 Updated updater screen (thanks a lot to Pankakes#0686) 2022-11-17 21:44:43 +10:30
coolGi ec8e54d31b Forgot to add the "isMinecraftSubProject" variable to subprojects 2022-11-17 19:15:08 +10:30
coolGi d538b5c12b Best that I can do with the build system for now (forgegradle hates me for some reason) 2022-11-17 19:10:01 +10:30
coolGi 4fe24abc51 Save commit for new build system 2022-11-14 21:51:09 +10:30
James Seibel 4644121fe3 Add getWrappedMcObject_UNSAFE() to Biome and BlockState Wrappers 2022-11-13 21:50:10 -06:00
James Seibel f75c9ec06a Refactor/comment DhSectionPos, DhLodPos, and DhLodUnit
And add BitShiftUtil
2022-11-06 21:41:05 -06:00
coolGi e174939cf5 Core doesnt like pushing itself 2022-11-04 17:37:27 +10:30
coolGi b8ecbdd27d Added a lang auto formatter and a missing lang detector and fixed up the lang formatting and added missing options 2022-11-04 17:35:24 +10:30
morippi 100401e0ac I made some error with the commits 2022-11-03 17:53:20 +01:00
morippi a5f2ce79e4 partial fix for ocean holes 2022-11-01 20:29:44 +01:00
coolGi 4358360362 Swapped out the bottom 2 buttons on the update screen 2022-10-30 19:34:27 +10:30
coolGi 889fc7d7fe Fixed mixin plugin and made it be more abstract (sodium class not found bug fixed) 2022-10-30 19:29:25 +10:30
coolGi 8fec85d4cb Added stuff that people suggested to the update screen 2022-10-30 18:36:50 +10:30
coolGi de744d1f10 Updated readme to add/remove the libraries we use and added instructions for how to open cmd 2022-10-29 09:17:08 +00:00
coolGi 4e50099308 Core didn't push 2022-10-28 10:09:02 +10:30
coolGi e17f201e6b Finished the self updater 2022-10-28 10:07:46 +10:30
coolGi 14fb775212 Added the self updater to forge and fixed standalone jar 2022-10-21 17:32:25 +10:30
coolGi 9742a2146a Added the self updater to forge 2022-10-20 22:47:48 +10:30
James Seibel 270476f4d2 replace customModule dependencies with implementation's
This shouldn't change how anything compiles and is done for simplicity sake
2022-10-15 20:34:45 -05:00
James Seibel b1205c73d5 Add parenthesis and comments to build.gradle 2022-10-15 20:33:16 -05:00
James Seibel 760019aac6 calm down the gradle.prop mcVer comment 2022-10-14 21:23:29 -05:00
James Seibel a89df000d0 Merge branch '1.19.2' into 'main'
1.19.2

See merge request jeseibel/minecraft-lod-mod!22
2022-10-12 12:50:00 +00:00
Jeff McClure 3278d3518d 1.19.2 2022-10-12 12:50:00 +00:00
James Seibel 0f8bf01d30 Update coreSubProjects 2022-10-05 22:42:19 -05:00
coolGi e4132fe469 Changed out the json library with something that we already have 2022-10-04 17:24:44 +10:30
coolGi f593df5d1d Changed out the json library with something that we already have 2022-10-04 17:24:25 +10:30
TomTheFurry a42153dc14 FINALLY fix the issue where some data isn't saved and etc 2022-10-01 15:02:24 +08:00
James Seibel 7dbb17b339 Add "Dh" prefix to DistantHorizons Worlds 2022-09-29 21:54:00 -05:00
coolGi 4e226130df Fixed up some listener stuff in the config 2022-09-25 12:24:41 +09:30
coolGi abf5ec313a Added a way of just running the config ui by itself so I can do quicker tests 2022-09-19 19:20:50 +09:30
TomTheFurry 2257ceae53 Continue improving stabilises of the system 2022-09-19 14:54:46 +08:00
TomTheFurry e330a7cd3b Add render source flag debug mode & fix sparse source to render source transform bug 2022-09-19 12:28:39 +08:00
TomTheFurry 9316575534 Fix critical issue causing chunk to lod build extremely slow, and also partly fix sparse data source loading (where I used wrong array instead of loaded data array.) Also improve ChunkToLodBuilder building loops to support multithreaded building 2022-09-18 16:30:45 +08:00
coolGi 3046127b03 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
2022-09-18 15:31:28 +09:30
coolGi 7a4e784701 Added some api notes and moved JarMain to the jar folder 2022-09-18 15:31:07 +09:30
TomTheFurry 96a2b406aa Rework the Level data member organization and make world gen enable/disable based on settings 2022-09-18 13:58:03 +08:00
TomTheFurry e2db3cdc5c Make it build again 2022-09-18 12:55:31 +08:00
James Seibel 99fa754e91 Rearrange API packages 2022-09-16 23:57:39 -05:00
James Seibel be28eaf122 Make Core Level Wrappers implement API wrappers 2022-09-16 22:55:37 -05:00
TomTheFurry cd05d5d811 Clean up transparency and buffer render orders. 2022-09-16 17:54:18 +08:00
Ran f6f7c1702a Hopefully fix the API shading 2022-09-16 10:58:42 +06:00
James Seibel b593293c05 Update coreSubProjects 2022-09-15 22:30:34 -05:00
TomTheFurry 1f1f44766d No longer saving empty files & rework isEmpty flag to be more stable & work on genQueue issue
Note: Known half fixed issue where in large render distance, the genQueue will block server thread for ages to build up gen request index.
2022-09-16 00:18:26 +08:00
James Seibel 6ebd768d97 Add API Event tests 2022-09-13 21:56:20 -05:00
James Seibel bd75c7454c Hook up the API events (some are missing parameter objects) 2022-09-13 21:44:11 -05:00
James Seibel 1c2fab1528 fix the semantic version number 2022-09-13 07:42:39 -05:00
James Seibel 92a096a708 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2022-09-12 22:25:13 -05:00
James Seibel e331def140 Flip API -> Core dependency to Core -> API 2022-09-12 22:25:10 -05:00
James Seibel 31c1e40ec1 Merge branch 'iris-compat' into 'main'
Added support for iris

See merge request jeseibel/minecraft-lod-mod!21
2022-09-13 03:24:34 +00:00
mcrcortex 8ced3f838d Added support for iris 2022-09-13 13:16:53 +10:00
TomTheFurry b37bf72eb2 Fixed some bugs when moving across dimensions 2022-09-13 00:09:29 +08:00
TomTheFurry c6485f5e92 Rename 'io' package to 'file' 2022-09-12 23:40:21 +08:00
TomTheFurry 4d2132cc08 Move ParsedIp class into 'util.objects' 2022-09-12 22:48:59 +08:00
TomTheFurry cb3dfd6786 Reorganize all the classes and move them around to make more sense and be easier to navigate. Also removed/unwrapped the 'a7' temp package. 2022-09-12 22:43:06 +08:00
TomTheFurry 0af836f2f5 Nuke no longer used files and fix bugs where I'm using the wrong class for doing data formats 2022-09-12 22:13:20 +08:00
Ran 509184f5ce Shade the API using Forgix 2022-09-12 10:11:57 +06:00
Ran d788ded283 Shade the API 2022-09-11 21:01:22 +06:00
James Seibel 131e257739 Remove the commonInterface sub-project 2022-09-10 20:04:13 -05:00
James Seibel 9333c006b7 Fix the level API events 2022-09-10 17:10:55 -05:00
James Seibel 59ca964231 remove commented out transparency code 2022-09-10 17:10:36 -05:00
TomTheFurry 293942b7de Fix region load bug & fix corrupt file load error handling & fix downsampling bug & fix sparse failing to save the promoted version 2022-09-11 00:13:33 +08:00
coolGi fce9a94b96 Fixed logo on readme 2022-09-10 15:33:51 +00:00
TomTheFurry a344389500 Fixed duped and wrong call to drawLODs in fabric. Now it use Fabric api instead of mixin. 2022-09-10 17:04:08 +08:00
coolGi 000d87ccdd Fixed ci 2022-09-10 17:44:58 +09:30
coolGi f241d849b7 (core dosnt like to push itself) 2022-09-09 23:12:59 +09:30
coolGi a315b1190a Made the config abstract (so it can be used by other mods using our api) 2022-09-09 23:12:20 +09:30
TomTheFurry a35a268670 Make tint works again! Impl getting tint without level obj but with biome obj. 2022-09-09 15:29:24 +08:00
TomTheFurry dff898e228 Fix adj sections rendering quad merge bug 2022-09-09 14:37:03 +08:00
TomTheFurry 9ab67716bc Fix lighting 2022-09-09 14:16:58 +08:00
TomTheFurry cc554991fe *Kinda* working now. Async the updateCache to io thread, and fix stream close issue 2022-09-08 22:31:25 +08:00
TomTheFurry 7366b543bd Fixed various bugs & Add some info to be logged to F3 2022-09-08 21:18:38 +08:00
TomTheFurry 480f3d9563 Hopefully... fix the gitlab bug? 2022-09-07 21:36:45 +08:00
James Seibel 991e4b8b20 Update coreSubProjects 2022-09-07 07:47:29 -05:00
James Seibel 2f6551904a Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2022-09-07 07:47:24 -05:00
James Seibel dc1ee3faaf comment out API code 2022-09-07 07:44:25 -05:00
James Seibel f96196a421 Remove dependencies on ClientApi logger 2022-09-07 07:44:16 -05:00
James Seibel 678eeaa3bf Update sub-projects 2022-09-07 07:43:47 -05:00
TomTheFurry 87dbda685b Overhaul how files and partially loaded sources are handled
Note: Currently it DOES render, it just... requires the ENTIRE area to be generated. This bug will be fixed... tomorrow. I hope. (It's like 11:35pm here so gimme a break!)
2022-09-05 23:37:00 +08:00
TomTheFurry 954dc49932 Overhaul how files and partially loaded sources are handled
Note: Currently it DOES render, it just... requires the ENTIRE area to be generated. This bug will be fixed... tomorrow. I hope. (It's like 11:35pm here so gimme a break!)
2022-09-05 23:36:52 +08:00
coolGi 0c031588aa Fixed issue #390 (problems with BCLib fog) 2022-09-02 15:14:03 +09:30
coolGi 6e419b3120 Forgot to add this 2022-09-02 12:27:55 +09:30
coolGi de0ddee3fb Core, can you please push? 2022-09-02 12:13:25 +09:30
coolGi 59fac2fa11 Started work on auto updater screen 2022-09-02 12:12:50 +09:30
James Seibel ef0d3b3957 Setup the API sub-project gradle dependencies 2022-08-30 22:02:39 -05:00
James Seibel f34be62af4 add apiInterface and coreApiCommon subprojects
Currently they are just shells and they may be renamed later
2022-08-30 07:55:42 -05:00
James Seibel 151ee93842 Move the api sub-project into core 2022-08-30 07:40:10 -05:00
James Seibel c89757aa5d rename "core" to "coreSubProjects" 2022-08-30 07:36:44 -05:00
Ran 2617fcfab1 nvm it deletes the package :( 2022-08-25 17:55:07 +06:00
Ran 0528a2d423 *Hopefully git doesn't delete the package* 2022-08-25 11:53:00 +00:00
Ran aa62921986 Add the package for the API 2022-08-25 17:51:37 +06:00
Ran f39ae98a48 Add API module 2022-08-25 17:50:10 +06:00
Morippi e10e51ae26 Divided transparent from opaque in the rendering (transparent are not rendering for some reason) 2022-08-24 21:54:57 +02:00
Morippi 758e941da9 small fixes + removed lodBox 2022-08-24 16:32:16 +02:00
Morippi 34777b1672 enabled and fixed ocean floor (light not working correctly) 2022-08-24 15:15:21 +02:00
Morippi a8156d90d8 Redoing everything on transparency, I hope I'm not breaking anything 2022-08-24 13:15:20 +02:00
Morippi 45527ada14 small changes 2022-08-24 12:50:14 +02:00
Morippi b6b98b1c00 Added transparency support (still not fully working 2022-08-24 11:43:04 +02:00
James Seibel d7b98c9762 Add getWrappedMcObject to DimensionTypeWrapper 2022-08-23 21:33:10 -05:00
James Seibel fc9faeb6e5 Comment out module related gradle code
We are going to use a separate (intellij?) module instead for the API
2022-08-23 21:29:09 -05:00
TomTheFurry c965fb41b9 Created SparseDataSource 2022-08-23 13:27:23 +08:00
TomTheFurry 379a09b9c9 Making multi-level works a bit better... Needs more changes to work well though... 2022-08-20 21:25:08 +08:00
Ran da0b34b2dc Update Forgix 2022-08-20 09:38:31 +00:00
TomTheFurry 6153b68302 Fix forge build 2022-08-20 17:32:35 +08:00
TomTheFurry 3fc60909d2 Fix bugs in CQCPTree 2022-08-20 15:49:12 +08:00
TomTheFurry a20ab505ef Did the generation stuff change 2022-08-18 18:29:04 +08:00
James Seibel 8f412d5dc7 Stub out a potential fix for #287 (optifine resolution) 2022-08-16 20:30:05 -05:00
James Seibel bb7e993d10 Implement DhApi Pre/Post Init Events 2022-08-15 21:56:21 -05:00
TomTheFurry 8aeceb717c Ops. Undo my hack to limit java usage to 8 in IDE. 2022-08-14 23:42:57 +08:00
TomTheFurry 1b2fc0e364 Start rework on the generationQueue system so that it hooks directly into base DataFileHandler instead of watching for PlaceHolder obj.
This also means a hyper complex concurrent customized quad tree implementation... So, great.
2022-08-14 23:42:42 +08:00
Ran 2bf6b59419 update core 2022-08-12 11:09:29 +06:00
Ran 5e6080da78 module-info.java 2022-08-12 11:08:31 +06:00
TomTheFurry a4a23121c8 Make multi-level works again! 2022-08-10 20:47:10 +08:00
TomTheFurry fa6e36cb44 First fix on light & impl render source direct write 2022-08-09 16:08:55 +08:00
TomTheFurry 64eb773ab8 Fixed multiple major RAM issues. Next one is the 100/s reload issue... 2022-08-08 23:00:30 +08:00
coolGi 841e831ce0 Added an auto updater when game starts 2022-08-06 20:32:09 +09:30
TomTheFurry 427b54b1eb Implemented untested FullDataType serialize & deserialize 2022-08-06 00:08:16 +08:00
TomTheFurry 00e831c8f3 Fixed block color & improve close 2022-08-04 20:03:43 +08:00
TomTheFurry a5d5168b07 Fixed all the data view bugs 2022-08-04 19:07:45 +08:00
TomTheFurry 521dfb83e4 Fixed all the data view bugs 2022-08-04 19:07:19 +08:00
TomTheFurry d414a27498 Something renders! And introduce mem leaks, missing texture color, and inverted lights! What a great set of features! 2022-07-30 16:06:55 +08:00
TomTheFurry 7e8ce1c695 Fix interrupt 2022-07-30 00:12:09 +08:00
TomTheFurry 302a894cb3 Fix forge wrong proxies, fix generator shutdown, fix batch gen incorrect timeout, 2022-07-30 00:11:26 +08:00
TomTheFurry 0c213aa860 Fix up all file IO bugs, FullFormat bugs, FullToColumn bugs, & Tree assert issues 2022-07-28 19:33:53 +08:00
TomTheFurry 142deb47cb Improve generationQueue and add more and better logging and fix double close on DhLevels 2022-07-27 14:49:03 +08:00
Ran 4390b1c694 Fix Junit 2022-07-26 22:49:12 +06:00
TomTheFurry c26f196318 Fixed 1 wrong logging 2022-07-26 23:36:49 +08:00
TomTheFurry 4cae95a942 Fixed IO bugs 2022-07-26 23:14:29 +08:00
Ran d07219758f Start revamping the build script 2022-07-26 21:11:08 +06:00
Ran 051b2e31b9 fix having mixin imports in core 2022-07-26 20:32:02 +06:00
TomTheFurry 6e0ea18ca3 Hey Fixed more maths! 2022-07-26 22:20:27 +08:00
TomTheFurry 407d633a6c Fixed realllly wrong maths 2022-07-26 21:54:41 +08:00
TomTheFurry a4ae25886a Continue fixing bugs... Lots of bugs. 2022-07-26 20:17:26 +08:00
TomTheFurry ae02066093 Fix bunches of bugs. Quad tree ticks! Gen call is fired! Chunk gen works! Next to fix: File updates 2022-07-26 17:06:51 +08:00
TomTheFurry fd4f628618 Trying and failing to find a bug. Gonna call it a night. 2022-07-26 01:04:01 +08:00
TomTheFurry b389b144c1 Resolving one by one many bugs lying around 2022-07-26 00:13:10 +08:00
TomTheFurry 95e929220a Resolving one by one many bugs lying around 2022-07-26 00:13:01 +08:00
coolGi 3d6d2a62f9 Removed some jank code 2022-07-25 23:11:16 +09:30
coolGi 60d8d0be50 Removed some jank code 2022-07-25 23:11:01 +09:30
TomTheFurry 18f5c6aa95 Fix stuff so fabric works and no crash. Sadly nothing renders though... 2022-07-25 21:23:54 +08:00
TomTheFurry 13f28a9bd8 Fix stuff so fabric works and no crash. Sadly nothing renders though... 2022-07-25 21:23:36 +08:00
TomTheFurry 640c6b8a9c Rework forge to new a1.7 structure. Minecraft runs and it builds. But crash on loading into world due to... weirdness 2022-07-25 19:44:12 +08:00
TomTheFurry 69202b86cd Fix and port batch generator to new Generator API. Now if we just fix up forge, and there's no bugs (impossible), then there's enough implemented to finally have something shown! Yay! 2022-07-25 13:38:33 +08:00
TomTheFurry 330bab0616 Work on world generator integration to a1.7 rework 2022-07-23 16:40:19 +08:00
TomTheFurry c77d0bab6d Fixing stuff towards successful builds. Now stuck on thinking how the world gen stuff should return and apply the gen chunk to data though... 2022-07-21 17:40:28 +08:00
James Seibel 7ef14602f5 Update core 2022-07-17 20:50:06 -05:00
James Seibel 762ef42a48 Rename SingletonHandler -> SingletonInjector 2022-07-17 19:34:03 -05:00
coolGi ba07a4188b Changed the design to the installer GUI 2022-07-11 16:06:46 +09:30
coolGi 4a6387b383 Added an auto installer (works with everything except when downloading from cursedforge cus it is being annoying) 2022-07-08 21:02:17 +09:30
coolGi b7254c7d12 Fixed windows auto builder script 2022-07-07 14:22:52 +00:00
James Seibel 8873503853 Update core and wording of CI script 2022-07-02 22:50:31 -05:00
TomTheFurry 430b23bb45 Milestone!! Both fabric:runclient & fabric:runserver now works!!!!! (in 1.18.2 for now) 2022-07-01 18:17:08 +08:00
TomTheFurry 1c785fded8 It now able to join level without error spams! 2022-07-01 17:06:08 +08:00
TomTheFurry f2bfc50a31 It now able to join level without error spams! 2022-07-01 17:05:52 +08:00
TomTheFurry 17ffa3eaba It... builds? 2022-07-01 15:06:17 +08:00
coolGi a6805eeb9a ci file broke? so just commented stuff out 2022-06-26 11:03:54 +00:00
coolGi2007 b3d7623276 Added network stuff to standalone jar 2022-06-26 11:00:09 +00:00
coolGi df5e61f4bd Core didn't push itself :/ 2022-06-24 22:51:18 +09:30
coolGi 8cd841220d Added more stuff for the standalone installer 2022-06-24 22:50:21 +09:30
TomTheFurry fd5fd05622 Front-port the ci fixes by magneticflux for now 2022-06-23 22:56:26 +08:00
TomTheFurry 6769702d45 Core didn't push... 2022-06-23 22:47:28 +08:00
TomTheFurry 2ce16a0594 If this serializer stuff works first try than I'm surprised 2022-06-23 22:46:13 +08:00
TomTheFurry cd2f2c4ae5 2nd Refactor started. Split to 3 type world structure 2022-06-22 20:43:00 +08:00
TomTheFurry 0f4e9792d2 Moved a7 package 2022-06-22 17:01:11 +08:00
TomTheFurry cf1be5f3ba Update Manifold 2022-06-22 16:59:00 +08:00
James Seibel f2c919725a Update the readme (remove the nightly links)
The nightly links should only be available in our discord. That way if people have issues we are there to help (and we can put up notifications if there are issues).
2022-06-21 07:45:42 -05:00
coolGi 5e5b218e14 Made jar run without fabric api 2022-06-19 14:41:20 +09:30
coolGi 0d18b38434 Added 1.19 to main branch 2022-06-16 18:39:22 +09:30
coolGi 3838f06723 Started work on 1.19 for main branch 2022-06-13 15:58:51 +09:30
TomTheFurry d255e08204 Missed a bit of the changes 2022-06-13 05:50:48 +00:00
TomTheFurry c2feac4642 Front-port 1.19 build script change 2022-06-13 05:47:19 +00:00
TomTheFurry 93f2605c6d Update manifold to latest version
Hopefully less compiler bugs this time!
2022-06-12 05:02:47 +00:00
coolGi c1c80f1000 Removed most cases of LodConfigWrapperSingleton 2022-06-11 22:27:16 +09:30
James Seibel 7555073c14 Prepend "E" to all enums 2022-06-09 21:11:52 -05:00
James Seibel fa607062fa Start adding API Tests 2022-06-06 22:25:48 -05:00
coolGi 8bfe624f97 Renamed Main to ForgeMain and added some config ui comment stuff 2022-06-03 17:13:28 +09:30
TomTheFurry 32a5880c17 Fix up multiple errors and init issues everywhere 2022-06-02 17:38:20 +08:00
TomTheFurry d51d403906 Fixup some init order errors and work on able to enter world. 2022-06-02 13:54:16 +08:00
TomTheFurry 1fb42f3c8e Rework fabric hooks to use more fabric api if possible
(Since, honestly, their hooks location is way better when it exists...)
2022-06-02 12:57:32 +08:00
TomTheFurry 87fdfc5048 Working on actually hook up events to use new one 2022-06-01 22:55:58 +08:00
coolGi 5f7de8ff5b Building should now be working 2022-05-31 11:34:56 +09:30
coolGi 3e6a2314bd Renamed stuff to fix building 2022-05-31 10:59:32 +09:30
TomTheFurry deebd9a8cf Hey, Core builds now! (No clue what would happen though) 2022-05-30 22:35:58 +08:00
coolGi2007 3e71f31f8e Added some basic stuff for the f3 screen 2022-05-26 08:58:10 +00:00
Ran f7d4642a44 Remove fabric networking mixins from forge 2022-05-19 10:43:58 +00:00
Ran 59a6cae353 Switch over to Architectury API for networking 2022-05-19 16:32:24 +06:00
coolGi2007 ef53a299f9 Now a triangle in the config screen (until you resize the window, then it crashes) 2022-05-11 12:25:27 +00:00
Morippi c5def9b663 Added Air lod container 2022-05-11 09:33:57 +02:00
coolGi 71860612af Getting some stuff ready for architectury 11 2022-05-10 17:52:30 +09:30
James Seibel 354a3c6133 update the credits text 2022-05-08 17:54:05 -05:00
James Seibel bc49bfe2ba Update .gitlab-ci.yml comments 2022-05-08 12:57:21 +00:00
coolGi c0e48a29a5 Now can the ci run a bit faster? 2022-05-08 15:41:38 +09:30
coolGi 363f865168 Sorry about that, it didnt work 2022-05-08 15:36:41 +09:30
coolGi d6ceeee2a3 Maybe the ci might be a bit faster (like very little tiny bit faster) 2022-05-08 15:34:56 +09:30
coolGi f6dc7492f9 why dont you update core :( 2022-05-08 15:29:21 +09:30
coolGi 4b4b1f0ddc Set up theming for standalone jar and moved shadow stuff to main gradle 2022-05-08 15:28:43 +09:30
coolGi e5524edc4a Merge remote-tracking branch 'origin/main' 2022-05-07 22:37:52 +09:30
coolGi 75de1e5fd1 Changed my name to coolGi 2022-05-07 22:36:45 +09:30
coolGi 9c1c6d3503 Updated core 2022-05-07 22:30:43 +09:30
James Seibel ee55f066a9 Set the api version to 0.0 (since it hasn't been released yet) 2022-05-03 21:28:08 -05:00
TomTheFurry e06889a322 Add new a1.7 rebuild first step 2022-05-03 19:22:36 +08:00
TomTheFurry 7dd26b110b update core 2022-05-03 14:22:07 +08:00
TomTheFurry de7dbcb622 Fix spawnerBlock bypass for 1.16.5 2022-05-03 14:18:51 +08:00
TomTheFurry 9678be05a8 Del ChunkPosWrapper & BlockPosWrapper, Create DHChunkPos & DHBlockPos, and also their related changes so it runs. 2022-05-03 14:06:26 +08:00
CodeF53 db8581da57 Typos 2022-05-01 10:34:56 -06:00
CodeF53 f7423af5f4 Add a toggle for avoided blocks tint. Close #281
This is off by default

Additional comments in #tech-talk:
https://discord.com/channels/881614130614767666/902896965354930217/970351193928921139
2022-05-01 10:00:30 -06:00
TomTheFurry 518fcfca97 Fixed the mob spawner failure message by adding whitelist to spawner block entity 2022-05-01 16:18:43 +08:00
TomTheFurry ecdada10c0 Added pre merge quads for more performance!!!! 2022-05-01 16:05:11 +08:00
TomTheFurry 7ffdf6f514 Improved throwable logging for two custom logger 2022-05-01 13:14:30 +08:00
coolGi2007 2b8aea39d7 Updated toml and json and fixed up a mistake in the readme 2022-04-30 18:51:07 +09:30
coolGi2007 502d3424b0 Some api stuff for config and updated readme to add json 2022-04-29 23:30:25 +09:30
coolGi2007 33748510fe New config finally done 2022-04-29 14:18:29 +09:30
coolGi2007 9f55203d69 Fixed 1.16.5 not building (1.17.1 still not fixed yet) 2022-04-28 13:15:00 +09:30
James Seibel 241dd14431 Merge branch 'main' of gitlab.com:jeseibel/minecraft-lod-mod 2022-04-27 21:56:21 -05:00
James Seibel bf5fded327 Remove invalid preprocessors from Core 2022-04-27 21:56:18 -05:00
coolGi2007 7423b9577d Fixed building (why wasnt this done before?) 2022-04-28 12:16:19 +09:30
James Seibel 54a3c5750e Add the first draft of the DH Api 2022-04-26 22:04:29 -05:00
James Seibel 1bf8317398 add DEV_BUILD as a preprocessor
The preprocessor automatically activates if the mod version contains "dev"
2022-04-26 21:30:06 -05:00
James Seibel 5a0d7b0d67 Prep for the external DH API 2022-04-24 19:18:58 -05:00
James Seibel 64b0e312f3 Replace the ApiShared Logger with class specific loggers
This should make the logs easier to understand.
2022-04-24 19:13:39 -05:00
James Seibel d22aab08cb Change the license from GPL to LGPL 2022-04-24 15:29:03 -05:00
Ran 0368342336 Also add the forgor to the json file 2022-04-23 21:21:59 +06:00
Ran 0ccae5ebbc I didn't forget about this & it went unnoticed for months 2022-04-23 21:12:58 +06:00
James Seibel e5a8464647 update the version number to 1.7.0a-dev 2022-04-22 22:28:31 -05:00
James Seibel 6acb4d4184 Update the version number in ModInfo 2022-04-22 21:17:43 -05:00
James Seibel 2798368099 Remove the experimental build warning 2022-04-22 21:08:10 -05:00
James Seibel bcdce2bdf5 Release 1.6.3a 2022-04-22 20:38:34 -05:00
TomTheFurry 43773652aa Updated some config defaults and min/maxs 2022-04-22 21:11:45 +08:00
TomTheFurry 10072200b5 Updated some config defaults and min/maxs 2022-04-22 21:11:35 +08:00
TomTheFurry a00647f8e7 Add the cave culling switch logic 2022-04-22 21:07:10 +08: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
James Seibel 17e375bc61 Return IBlockDetailWrappers 2022-03-19 20:04:11 -05:00
James Seibel a2c8c90a5e Merge branch '1.18.2' into preprocessor_test 2022-03-19 19:56:04 -05:00
James Seibel b376014df8 Update the manifold version 2022-03-19 18:20:28 -05:00
James Seibel b9ee54f6ad add multi-dim and brightness/saturation 2022-03-19 12:39:09 -05:00
James Seibel 6c7e1900a3 Merge in fog changes 2022-03-19 11:20:44 -05:00
tom lee 6f929f40f9 Update core 2022-03-19 22:34:11 +08:00
James Seibel b6a8930855 Add a config for the MultiDimension Similarity 2022-03-18 23:57:32 -05:00
coolGi2007 7a91b258de Updated mods, readme and fixed 1 thing in the config gui 2022-03-17 17:52:19 +10:30
TomTheFurry 35bef76aeb Fix 1.18.2 WorldRenderer renderSky() mixin falling 2022-03-16 19:57:27 +08:00
TomTheFurry 780d0ad9fb Complete the push 2022-03-16 18:53:16 +08:00
TomTheFurry c0d5dd6dee ADVANCED FOGGGGGGGGGGGGGGGG~~~~~~~~~~~~~~~~ 2022-03-16 18:52:56 +08:00
TomTheFurry 3e87e625ba Pushed the stuff leetom did on my macbook 2022-03-15 21:17:07 +10:30
TomTheFurry 56f9403859 Add proper multi FrameBuffer support(And fix MacOS?) 2022-03-15 16:38:39 +08:00
TomTheFurry 8259c79e9c Fixup MixinUtilBackgroudThread+more render log 2022-03-15 18:48:27 +10:30
TomTheFurry be1e2fe7e6 Merge remote-tracking branch 'origin/preprocessor_test' into preprocessor_test 2022-03-15 12:38:10 +08:00
TomTheFurry 609ee5c70d Improve GLMessage Parser 2022-03-15 12:37:51 +08:00
James Seibel 207cab9a0f Clean up the build script 2022-03-15 04:05:12 +00:00
James Seibel c80b025ac1 Clean up the build script 2022-03-15 03:52:25 +00:00
James Seibel 8610917b86 Update .gitlab-ci.yml file 2022-03-15 03:41:17 +00:00
James Seibel fae4bee871 Update .gitlab-ci.yml file 2022-03-15 03:34:52 +00:00
James Seibel b9608498a2 Check if Gradle setup is necessary + fix artifacts not being populated 2022-03-15 03:34:29 +00:00
James Seibel fe59c6b0c9 Check if Gradle setup is necessary 2022-03-15 03:25:09 +00:00
James Seibel b082b048d6 Update .gitlab-ci.yml file 2022-03-15 03:21:59 +00:00
James Seibel 91712cee2a Rough artifact test 2022-03-15 03:21:44 +00:00
James Seibel 5adfbb2dee Update .gitlab-ci.yml 2022-03-15 03:04:50 +00:00
James Seibel ec32d09468 Try separating the archiving into a separate step
This will make adding/removing MC versions to compile easier
2022-03-15 02:51:39 +00:00
James Seibel 919990820e Fix exporting duplicate jars 2022-03-15 02:43:12 +00:00
James Seibel 5cc31efa12 Attempt to add 1.18.1 and 1.18.2 auto building 2022-03-15 02:16:04 +00:00
TomTheFurry 5f48b41693 Add Advanced Fog config entries. Actual impl is a todo. 2022-03-15 00:00:36 +08:00
TomTheFurry 9530eea287 Update core and fix serverRenderDistanceMax not being checked 2022-03-14 16:23:04 +08:00
TomTheFurry ebbf304c94 Updated core 2022-03-14 15:10:20 +08:00
TomTheFurry 7c8ac0c2ff Fix mistakes + update core 2022-03-13 22:57:42 +08:00
TomTheFurry eefad5e052 Improved getMaximumRenderedChunk and fix GLMessage on forge 2022-03-13 22:57:07 +08:00
TomTheFurry 9a1e6e29d4 Update Readme.md on switching versions 2022-03-13 16:45:41 +08:00
TomTheFurry 62ab450d98 Update Core 2022-03-13 16:16:29 +08:00
TomTheFurry b4a5da4a74 Update Config defaults 2022-03-13 16:15:29 +08:00
TomTheFurry ed82480c89 Update .gitmodules properly this time 2022-03-13 07:41:53 +00:00
TomTheFurry 82449c5edc Update and fix core branch tracking(I think?) 2022-03-13 15:40:08 +08:00
TomTheFurry b165726bc9 Add new Config: BiomeBlending 2022-03-13 15:26:24 +08:00
TomTheFurry 11910d0f28 Fix IDE not reconising preprocessor 2022-03-10 17:29:27 +08:00
TomTheFurry f66e27b077 First version where 1.18.1 & 1.18.2 is merged 2022-03-10 17:05:14 +08:00
coolGi2007 f84570a6fc Downgraded stuff from 1.18.2 to 1.18.X 2022-03-10 16:35:20 +10:30
James Seibel 835beb607d Close #207 (re-add brightness/contrast configs) 2022-03-09 23:06:34 -06:00
TomTheFurry c4e2d3fb0f Remove unused stuff 2022-03-09 16:21:44 +08:00
TomTheFurry eb3d8d9da5 Add Manifold Preprocessor plugin to gradle 2022-03-09 16:14:16 +08:00
TomTheFurry 151d548099 Update core + Fix biome blending 2022-03-08 23:27:14 +08:00
TomTheFurry c5cdc2760f Update core 2022-03-08 16:05:30 +08:00
coolGi2007 a663bf9f19 Added the multiplayer folder thing from 1.18.X to 1.18.2 and fixed building 2022-03-08 17:43:10 +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
coolGi2007 7ddd48d132 Updated what james did from 1.18.X to 1.18.2 2022-03-07 16:56:35 +10:30
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
Ran ce10a43cc6 Fix accesswidener for 1.18.2 2022-03-03 14:34:47 +06:00
tom lee 5476af5bb3 Fixed chunkloader to work with 1.18.2 2022-03-02 19:28:16 +08:00
coolGi2007 b97b1b61b7 Reverted the commit that added 1.18.2 to this branch 2022-03-02 18:08:11 +10:30
coolGi2007 25d2cfd7b8 Quick 1.18.2 branch (**DISABLE GENERATION TO WORK**) 2022-03-02 17:43:46 +10:30
James Seibel 1b754387e0 Refactor the dependency injectors 2022-03-01 21:20:00 -06:00
James Seibel bcad40069f Merge branch '1.18.X' of gitlab.com:jeseibel/minecraft-lod-mod into 1.18.X 2022-02-28 17:57:01 -06:00
James Seibel 5aa9061006 remove the discord notification experiment
Using this changed how the messages look in a way I don't like; removing the committer's icon and commit message.
2022-02-28 17:54:41 -06:00
James Seibel 873e8cec57 Update .gitlab-ci.yml file 2022-02-28 23:37:29 +00:00
James Seibel f6f96c3aea Test pipeline discord notifications 2022-02-28 17:18:02 -06:00
tom lee aeed672295 Update core 2022-02-27 17:02:06 +08:00
tom lee 832fbe6d15 Update core 2022-02-26 16:16:00 +08:00
tom lee 03deddf666 Optimized the McObjectConverter for Direction 2022-02-26 14:04:49 +08:00
tom lee d06413d1b4 Update core 2022-02-25 15:15:51 +08:00
tom lee 8afa50d585 Update core + improved GenEvent Terminate speed 2022-02-24 22:28:59 +08:00
Morippi 9f28f1f812 Added comments 2022-02-23 18:26:35 +01:00
Morippi 985388fd90 Removed border from details circles and regions 2022-02-23 16:38:19 +01:00
tom lee e27e10082a Update core 2022-02-22 23:12:59 +08:00
tom lee 4e510d96fc Update core + fix colors. See commit in core 2022-02-22 23:10:58 +08:00
coolGi2007 c0ec02f062 forgot this like 2022-02-22 07:22:33 +00:00
coolGi2007 bd27a96bde Updated the readme and updated the DHJarMerger (now marks the jar as an executable so linux users have an easier time when runnung the jar) 2022-02-22 17:49:23 +10:30
tom lee d6aeaf8e9d Update Core 2022-02-22 11:37:22 +08:00
Ran 2b9bba4aa7 Update core 2022-02-21 17:36:08 +06:00
Ran 58b0991891 Put logger in ApiShared.java 2022-02-21 17:34:52 +06:00
Ran 59cbbef327 Merge remote-tracking branch 'origin/1.18.X' into 1.18.X 2022-02-21 17:29:41 +06:00
Ran 7047c81a2b Put logger in ApiShared.java 2022-02-21 17:27:54 +06:00
tom lee 6e2ab47359 Rework Block color / shape 2022-02-21 19:23:30 +08:00
Ran f879332e1d Client 2 Server packets 2022-02-21 13:40:42 +06:00
coolGi2007 6fcafecc61 Updated fabric, modmenu and readme 2022-02-21 16:36:10 +10:30
coolGi2007 a5af93aef1 Renamed the thing to JarMain 2022-02-20 22:26:01 +00:00
coolGi2007 4b84fd2a67 Added a way to run jar (dosnt do anything but could be used to check opengl and move mod to mods folder) 2022-02-20 22:16:21 +10:30
cola98765 924efc0cbd update core 2022-02-20 12:34:09 +01:00
tom lee 288457b5bd Update core 2022-02-20 17:35:11 +08:00
James Seibel d29fa86de6 Merge branch 'jeffthejeffthejeff-1.18.X-patch-51031' into '1.18.X'
Added an image and improved start of Readme.md

See merge request jeseibel/minecraft-lod-mod!17
2022-02-20 05:13:39 +00:00
James Seibel 97be227e3d Add a missing "s" 2022-02-20 05:12:16 +00:00
James Seibel 909d6a54c3 Slightly reword the blurb 2022-02-20 05:10:35 +00:00
Ran 228b6a80dc Merge branch '1.18.X' of https://gitlab.com/jeseibel/minecraft-lod-mod into 1.18.X 2022-02-20 09:32:44 +06:00
Ran 6936a5f96f I forgor 💀 2022-02-20 09:31:55 +06:00
cola98765 740560a50a actually fix tint on custom water textures. 2022-02-19 22:32:53 +01:00
cola98765 47c28f0f37 actually fix tint on custom water textures. 2022-02-19 22:28:35 +01:00
Ran 1c859cd7da Oops was registering channels to wrong environments 2022-02-20 00:15:33 +06:00
tom lee e4a97dd76d Update core 2022-02-20 01:01:59 +08:00
Ran 4fd1e5ea06 Update core 2022-02-19 22:58:05 +06:00
Ran 6039aeabde Server client communication! maybe 2022-02-19 22:55:53 +06:00
tom lee 17a384f074 Update core 2022-02-19 22:15:04 +08:00
coolGi2007 25e8f5ec6a Forgot to push this file 2022-02-19 08:30:06 +00:00
coolGi2007 eac8cacd42 Removed new config 2022-02-19 18:53:34 +10:30
James Seibel 75193d76a3 Update the version number to 1.6.2a 2022-02-17 20:11:13 -06:00
James Seibel aa24fd341e Update the version number to 1.6.2a 2022-02-17 20:10:02 -06:00
Dog 81adade05b Capitalised Source Code Installation to be grammatically correct 2022-02-17 23:55:38 +00:00
Dog e3808dc986 Updated title of Readme to look nicer 2022-02-17 23:45:55 +00:00
tom lee d669b2a1fe Update and merge the render_test core 2022-02-17 22:26:48 +08:00
cola98765 2bd8dab240 #159 multiply color by color... not by alpha 2022-02-15 11:50:14 +01:00
cola98765 2b423c2edd squared colour averaging as in #159
please check if it works looks better.
2022-02-15 11:37:54 +01:00
cola98765 1a4faf4bdd close #188; fix lang parts in #189 2022-02-15 11:21:23 +01:00
cola98765 b70829aceb RotatedPillarBlock colors are taken form sides, resolving #191 2022-02-15 11:06:37 +01:00
cola98765 bba771d376 Potentially fix water texture packs. 2022-02-14 17:31:36 +01:00
James Seibel 75b18f8bd8 Update the forge version to fix a potential crash with Biomes-o-plenty 2022-02-13 16:28:21 -06:00
James Seibel 60da404900 Merge branch '1.18.X' of gitlab.com:jeseibel/minecraft-lod-mod into 1.18.X 2022-02-13 07:37:43 -06:00
coolGi2007 b75eebd0dc Getting more stuff ready for new config 2022-02-13 14:48:56 +10:30
James Seibel 72cbd1167a Prepare for 1.6.1a 2022-02-12 12:01:40 -06:00
tom lee e4e51ebf5b Update core 2022-02-12 23:54:23 +08:00
tom lee dd2096bf1b Frontported the forge mixin issue fix. (It may work without that but...) 2022-02-12 23:54:23 +08:00
coolGi2007 393a94a7a1 We don’t talk about this 1 line in the gradle 2022-02-12 14:04:18 +00:00
tom lee ef0023ef39 Switch to another way to do the world gen. Now more mod compat! 2022-02-12 22:00:09 +08:00
coolGi2007 f0994fff75 Added a way to add mods in code and not run on runtime and moved issues and source to gradle.properties 2022-02-12 19:34:54 +10:30
tom lee 31f41540c0 Fix chat format color. Add failsafe stopping of generator 2022-02-12 15:13:58 +08:00
tom lee 81fe13b9c0 Add backup to VanillaRenderedChunks & many generator stuff 2022-02-12 14:30:04 +08:00
tom lee 332df13b29 Fix loadChunk try/catch missing the mark & add WRAN on modded chunkGen 2022-02-12 13:12:25 +08:00
James Seibel b3af6df0c5 Update the version number to 1.6.1a-pre and re-enable dev code 2022-02-11 22:08:35 -06:00
James Seibel 9392e618c0 I accidently removed the "a" 2022-02-11 20:00:40 -06:00
James Seibel fd361a39a1 Update the version number and homepage link for a1.6.0 2022-02-11 19:59:23 -06:00
coolGi2007 f41de59f39 Removed some file stuff that didnt work 2022-02-11 13:05:23 +00:00
coolGi2007 c701cf987b Merge remote-tracking branch 'origin/1.18.X' into 1.18.X 2022-02-11 16:07:22 +10:30
coolGi2007 f05e878600 Added version to config file for the future 2022-02-11 16:07:10 +10:30
tom lee dc028db5ed update core + change a bit for sodium get chunk so it works better 2022-02-11 13:35:39 +08:00
James Seibel c59d7a7d27 Slightly improve the tooltips for the config GUI 2022-02-10 22:07:55 -06:00
tom lee a3dd346a02 Update core + Config + fixed blindness fog 2022-02-10 22:05:57 +08:00
tom lee dba8061f71 Update core 2022-02-10 17:08:00 +08:00
tom lee 3da2d961fc Update core 2022-02-10 16:23:33 +08:00
James Seibel aa83dc7465 Update Core 2022-02-09 19:22:29 -06:00
Morippi 392821c081 Tried to fix the render distance min detail bug 2022-02-09 22:01:17 +01:00
tom lee 7e5fc979cc Impl MEM LEAK fix from 1.16, though didn't think it was an issue before 2022-02-09 18:46:37 +08:00
tom lee 7ebb555b94 Update core 2022-02-08 13:45:04 +08:00
tom lee 3612a2f9e0 Updated core 2022-02-07 14:02:12 +08:00
coolGi2007 42b67825f8 Added custom toml to forge 2022-02-07 09:46:08 +10:30
coolGi2007 30a636c840 Added toml to be able to be used in core 2022-02-07 09:14:08 +10:30
tom lee e5722c19a9 Update core and impl the changing Region Size 2022-02-06 22:55:06 +08:00
tom lee 6b6a9ab0a9 Update core 2022-02-06 21:33:58 +08:00
tom lee 6da74c6f4e Forgot to update core... 2022-02-06 19:40:03 +08:00
tom lee 0bafa37f66 Fix and unify how key events work 2022-02-06 14:58:39 +08:00
coolGi2007 6ba6b11f6b Use cursedforge rather than modrinth for sodium download 2022-02-06 05:45:58 +00:00
James Seibel 739653f37a Add an expiration to the archives 2022-02-05 15:42:15 +00:00
coolGi2007 213d70f2d1 Removed clouds 2022-02-05 09:41:53 +00:00
tom lee dda3c7636b Update core + Moved ChunkLoader to be in line with other versions 2022-02-05 16:24:24 +08:00
tom lee 3956578043 Update core 2022-02-05 14:44:30 +08:00
tom lee d11f067392 Update core 2022-02-04 14:33:55 +08:00
tom lee 9f9fe6a231 Updated core 2022-02-04 00:32:55 +08:00
tom lee 486a30cb93 Update core 2022-02-04 00:16:25 +08:00
tom lee 01545dc295 Update the generator with 1.16 changes 2022-02-03 18:01:09 +08:00
coolGi2007 165a3799f3 Put some stuff that was duplicated in gradle to the main gradle 2022-02-02 22:40:41 +00:00
coolGi2007 308f809d5d Cleaned up some gradle stuff 2022-01-30 15:53:47 +10:30
tom lee 003dbdff02 Fixed C2ME log spam compat issue 2022-01-29 17:33:57 +08:00
tom lee 99f8dbb042 Mod compat: Fixed issue with Repurposed Structures 2022-01-29 16:50:02 +08:00
tom lee 4263ea9733 Add patch for BCLib to solve patchy features gen issue 2022-01-29 16:11:52 +08:00
tom lee c09b07a21b Greatly improve speed on loading existing chunks. 2022-01-27 14:08:06 +08:00
coolGi2007 4e0160648b Fixed issue 162 (renamed stuff) 2022-01-27 02:38:13 +00:00
coolGi2007 ad367f681d (made accidentally added string at the end of something) 2022-01-27 12:51:37 +10:30
coolGi2007 a5a70cd65b Made stuff about mod get from gradle.properties so it is easier to edit 2022-01-27 12:50:19 +10:30
coolGi2007 4ff37cfdad Fxed forge version 2022-01-27 11:14:07 +10:30
cola98765 9a1abdefa1 fixed mergeMultiData and lodBuilder with connected lods 2022-01-26 09:25:50 +01:00
tom lee 37cc7e7b37 Fixed a bug causing Fast Light mode stuck in gen loop 2022-01-26 13:14:57 +08:00
coolGi2007 04cbb1e92c Fixed forge crashing on world join 2022-01-26 04:53:45 +00:00
CodeF53 5033175808 Fix small typo. 2022-01-25 17:52:45 +00:00
tom lee 689928708c Update core and fix forge serverTickEvent firing 2 times per tick 2022-01-25 18:27:21 +08:00
tom lee 98327e6fdf Update core + Config Wrapper 2022-01-25 17:08:55 +08:00
coolGi2007 5aef0977c0 I always forget to update core 2022-01-25 04:58:09 +00:00
coolGi2007 e6738f1c80 Added comments to config file (temp solution) 2022-01-25 15:26:21 +10:30
James Seibel b55c1b8f56 Delete OptiFine_1.18.1_HD_U_H4.jar 2022-01-25 00:59:34 +00:00
tom lee 3764a4cc9e Updated core and follow core changes 2022-01-24 23:37:33 +08:00
tom lee d6bbb9d8dc Updated core and followed with some tweaks for FAR_FRIST gen 2022-01-24 23:02:53 +08:00
tom lee a38e7a00e4 Update core, Change some small stuff. 2022-01-24 21:08:17 +08:00
coolGi2007 2ec84ae3cf Fixed a typoish thing 2022-01-24 09:21:51 +00:00
coolGi2007 f03035e3f9 After all these years, the ints show up correctly after restarting (it was literally a 1 line fix) 2022-01-24 19:41:33 +10:30
coolGi2007 1d914b8f8a Refactored some stuff 2022-01-24 18:54:16 +10:30
Ran ee947b36a2 maybe it'll work 2022-01-24 10:58:26 +06:00
Ran ba393f61e5 I forgor 2022-01-24 10:32:00 +06:00
Ran 796c8e7bef Update DHJarMerger-1.0.jar 2022-01-24 10:29:03 +06:00
CodeF53 fe60de314d Dummy commit to force new job 2022-01-24 03:41:08 +00:00
CodeF53 d237db3302 remove invalid yaml code from prior commmit 2022-01-24 03:23:05 +00:00
CodeF53 f665b452b0 Don't cache old builds, uncomment jar versioning. 2022-01-24 03:19:31 +00:00
James Seibel 17750691d6 comment out the jar versioning 2022-01-23 20:52:28 -06:00
James Seibel 89ba5b9d15 Update the pipeline 2022-01-23 20:33:27 -06:00
James Seibel cea44a3f8a Update the pipeline 2022-01-23 20:17:50 -06:00
James Seibel a99c9aff76 Update the pipeline 2022-01-23 19:11:15 -06:00
James Seibel 1827ab646c Update the pipeline 2022-01-23 18:56:48 -06:00
James Seibel db00f7ebec Update the pipeline 2022-01-23 18:45:23 -06:00
James Seibel 0b93c7b5dc Update the pipeline 2022-01-23 18:25:17 -06:00
James Seibel 97204f3a3c Update the pipeline 2022-01-23 18:11:18 -06:00
James Seibel 02a6db0a62 Update the pipeline 2022-01-23 18:00:43 -06:00
James Seibel 577af4d854 Update the pipeline 2022-01-23 17:58:42 -06:00
James Seibel 68155142c3 Update the pipeline 2022-01-23 17:44:11 -06:00
James Seibel 43897e1298 Add the version name override to fabric 2022-01-23 16:48:33 -06:00
James Seibel bf2c520966 Fix a typo in the pipeline 2022-01-23 16:47:24 -06:00
James Seibel ee1528f694 Merge branch '1.18.X' of gitlab.com:jeseibel/minecraft-lod-mod into 1.18.X 2022-01-23 16:26:16 -06:00
James Seibel 8bd7556c89 Add the dateTime to compiled jars and the commit to artifacts 2022-01-23 16:25:37 -06:00
James Seibel facbb174f5 Remove logo and IDE files (they are stored in Core) 2022-01-23 16:22:29 -06:00
tom lee 9d3ce5307c Updated core + cleanup imports in WorldGen 2022-01-23 23:17:04 +08:00
tom lee 54f3e9e12d Update core 2022-01-23 21:19:53 +08:00
tom lee e294fc79eb Fixed using wrong func for makeBiome(). 2022-01-23 20:28:35 +08:00
tom lee a750aaf90a Update core + cleanup some junks 2022-01-23 19:12:18 +08:00
James Seibel be8e09eb9b Update jar merging pipeline 2022-01-22 22:47:35 -06:00
James Seibel 016d26a6f7 Update jar merging pipeline 2022-01-22 22:35:51 -06:00
James Seibel 539698c456 Update jar merging pipeline 2022-01-22 22:34:35 -06:00
James Seibel bcc11b8f0c Update jar merging pipeline 2022-01-22 22:24:52 -06:00
James Seibel c2a960162e Add a link to Ran's Jar merger repo 2022-01-22 22:24:42 -06:00
James Seibel c42a3a5fb3 Update jar merging pipeline 2022-01-22 22:13:59 -06:00
James Seibel 59d6289177 Update jar merging pipeline 2022-01-22 22:04:56 -06:00
James Seibel 4f028d118d Set the default Generation Priority to NEAR_FIRST closes #160 2022-01-22 22:04:36 -06:00
James Seibel b555e35016 Update jar merging pipeline 2022-01-22 21:58:57 -06:00
James Seibel 26b4c3a2d9 Update jar merging pipeline 2022-01-22 21:34:46 -06:00
James Seibel 2a5199f851 Update jar merging pipeline 2022-01-22 21:18:32 -06:00
James Seibel 408dbc2169 Update jar merging pipeline 2022-01-22 21:05:09 -06:00
James Seibel c9ffcfb1e8 Add jar merging to the pipeline 2022-01-22 20:50:16 -06:00
tom lee 3bd1eedcb8 Fixed Lithium WorldGen NullPtr issue cause by lazyness
Detail cause: I only override the getChunk(x,y,status,bool) and not its
sub set like getChunk(x,y), getChunk(x,y,status) because... Programmer
is always lazy. Aren't they?
2022-01-22 23:05:11 +08:00
tom lee 8500ec7a00 Fixed WorldGen to provide better support for StarLight 2022-01-22 22:38:33 +08:00
tom lee 223570a0b7 Update core. Fixed WorldGen using Util.background threads 2022-01-22 18:10:53 +08:00
tom lee de8c063731 Update core + cleanup debug logging 2022-01-22 16:10:32 +08:00
tom lee 0cffa30286 Updated core 2022-01-22 13:45:51 +08:00
coolGi2007 1d3a282c60 Added optifine tough dosnt run yet since forge dependances arnt set up yet 2022-01-21 17:49:47 +10:30
tom lee 9b6cd955b5 Updated core 2022-01-20 22:54:06 +08:00
tom lee 8e1559ac61 Update core and fix under lava (and powder snow) render fog issue 2022-01-20 21:55:17 +08:00
tom lee ce597576ba Update core and fixed slight bugs 2022-01-20 19:29:22 +08:00
tom lee d53a7a5fc4 Update core 2022-01-19 23:33:09 +08:00
tom lee 35bb5cdc92 Update core 2022-01-19 19:01:50 +08:00
tom lee 26e9cc21fd Add and fix mod compat issue with Optifine 2022-01-19 13:52:05 +08:00
tom lee 71fd448b7f Dummy commit to kick start CI, hopefully. 2022-01-18 23:15:36 +08:00
tom lee 93e18230f0 GENERATE LOD FROM FILE IS HERE!!!!!!!
Noted issue:

1. Non problematic WARN of `Tried to access a block entity before it
   was created`

2. The loading is.... a bit slow due to single thread action. Will be
   improved soon.

3. Possible Chunk Status not correct issue. It... sometimes happen, but
   it's mostly fine~

Special thanks to the YouTube commentors on the a1.6 Teaser Trailer
video. If not for them, I would not notice how many people want this,
and actually look into slapping in this feature in a1.6.
2022-01-18 22:50:57 +08:00
cola98765 d305741be2 resolved warnings. part 3 2022-01-18 11:29:01 +01:00
cola98765 5830c8d87a resolved warnings. part 2 2022-01-18 11:00:08 +01:00
cola98765 5161439536 resolved warnings. now more carefully. 2022-01-18 10:38:40 +01:00
coolGi2007 deb6ada6cc Fixed a typo 2022-01-18 09:18:36 +00:00
coolGi2007 e72a0546be Cleaned up comment on gradle and made stuff more consistent 2022-01-18 19:24:36 +10:30
jas35484 e27b43f03a Increment the version from '1.5.4a' to '1.6.0a-pre' 2022-01-17 20:33:35 -06:00
jas35484 daf4f06a30 Add .gitlab-ci.yml 2022-01-17 19:51:40 -06:00
Ran e5ef93a26d Universal jar for forge & fabric 2022-01-18 00:43:13 +06:00
cola98765 b158dff2c6 Revert "resolved couple warnings. If it causes problems just revert it."
This reverts commit b390e54801.
2022-01-17 16:27:27 +01:00
cola98765 23bbbce749 reverted config changes.... it was a bit too final 2022-01-17 16:14:52 +01:00
tom lee 898be82aab Update core 2022-01-17 22:51:28 +08:00
tom lee dc9ed37de2 Update core 2022-01-17 22:04:07 +08:00
cola98765 b390e54801 resolved couple warnings. If it causes problems just revert it. 2022-01-17 14:18:14 +01:00
tom lee 9736d2169e Update core+fabric disable StarLight 2022-01-16 17:34:35 +08:00
tom lee b507f459b3 Add basic StarLight compat. (Make it not crash) 2022-01-15 21:56:48 +08:00
tom lee 51a7053d7e Update core & make LightMode easy to switch. 2022-01-15 19:10:59 +08:00
coolGi2007 3ba40dd910 Added starlight 2022-01-15 10:14:44 +00:00
tom lee 248f8e5e70 ExpWorldGen: Add LightMode support. TODO: Config. 2022-01-15 16:58:16 +08:00
coolGi2007 49b0911aaf Escape saves config and added a immersive portals comment 2022-01-14 13:52:42 +10:30
tom lee e4b40c9383 Update core + Add disableVanillaFog for Forge 2022-01-13 23:35:18 +08:00
tom lee 328ac93178 Fixed Sodium Fog Issue. 2022-01-13 20:00:36 +08:00
tom lee d91f86aed5 Update core 2022-01-12 18:18:01 +08:00
tom lee 8119cc06ad Finally a reliable onClientChunkLoad event without light issues! 2022-01-12 16:16:20 +08:00
coolGi2007 94c9d0e276 Updated core 2022-01-11 08:45:33 +00:00
coolGi2007 e262dfa14a Fixed clouds for immersive portals 2022-01-11 08:39:09 +00:00
coolGi2007 5e0b63347e Fixes all (hopefully) problems with saving the config file 2022-01-11 17:35:45 +10:30
coolGi2007 b7df3bad22 Added a warning for clouds 2022-01-10 04:54:37 +00:00
coolGi2007 6a56c0c96f Update to add mod versions 2022-01-10 04:15:41 +00:00
tom lee fd8a94d77c Impl a semi-working getRenderedChunk for Sodium 2022-01-09 14:57:42 +08:00
tom lee 7d38fac16d Update core & try patch the light issue 2022-01-09 00:31:39 +08:00
tom lee 235ffb03a5 Make light works on pre generated chunks! Changed ChunkWrapper 2022-01-08 22:53:51 +08:00
tom lee fa2702209c Impl a getVanillaRenderedChunk 2022-01-08 15:05:12 +08:00
coolGi2007 f9f9f98750 Removed FogRenderer from forge(sorry for adding) 2022-01-08 06:25:06 +00:00
tom lee 0c46947f4d Update core 2022-01-07 19:09:07 +08:00
tom lee b5b57dfaba Update core and config 2022-01-07 18:59:02 +08:00
tom lee 39e7812f8b Updated core. Fixed wrong math in VanillaRenderedChunks 2022-01-07 15:53:30 +08:00
coolGi2007 025e8b3f9b Made clouds more optimised 2022-01-07 17:33:31 +10:30
coolGi2007 35e3a4262b Added disable vanilla fog to forge 2022-01-07 11:45:51 +10:30
coolGi2007 562c8154ff Fixed some config stuff 2022-01-06 10:49:25 +00:00
tom lee e23244181a Update core & comment out debug. Fixed/Cleaned up Fabric/Forge warpper 2022-01-06 16:28:25 +08:00
tom lee 6aa6c32299 Update core and tried fixing FAR_FIRST. Failed though.
Will continue tomorrow.
2022-01-06 00:09:45 +08:00
coolGi2007 fbdabf52e7 Made a way to save 1 config entry at a time 2022-01-05 23:07:40 +10:30
tom lee f4c1f1bcd7 Updated core and fixed generator bug 2022-01-05 19:19:14 +08:00
coolGi2007 965c19d426 Save config if you set something in the config wrapper singleton 2022-01-05 20:45:06 +10:30
tom lee 239a876fcf Update core 2022-01-05 16:58:31 +08:00
tom lee d53165881f Update core and ExperWorldGen for faster >Chunk details generation 2022-01-04 18:58:58 +08:00
tom lee 40733ea1fc Update core 2022-01-04 16:47:07 +08:00
coolGi2007 66a16ee508 Made clouds get from texture rather than use noise 2022-01-04 07:57:55 +00:00
tom lee b1a9a8ac8d Update core 2022-01-04 15:11:36 +08:00
tom lee 06a2f9f336 Updated core and comment out the @ConfigAnnotations.Category 2022-01-03 00:10:11 +08:00
coolGi2007 978bc58c11 Removed the need for any config category. The config now guesses the category 2022-01-02 16:34:47 +10:30
coolGi2007 a5577e80f1 Reordered forge mixin 2022-01-02 05:16:16 +00:00
Eric 9daf5a013c Changed cloud projection matrix to have custom clip values. 2022-01-01 21:28:56 -07:00
coolGi2007 72e2cb8a64 Updated core and fixed config crash 2022-01-02 03:51:19 +00:00
cola98765 db819698af fixed updateData 2022-01-01 13:31:23 +01:00
tom lee 09e427ab97 Updated core 2022-01-01 15:26:34 +08:00
tom lee a6b3a7ea5a Update core and fixed MixinFogs and added underwater fog 2022-01-01 13:51:35 +08:00
tom lee 4d08339f79 Updated core 2022-01-01 12:05:12 +08:00
tom lee 2ba32a8c94 Update core 2021-12-31 21:03:18 +08:00
coolGi2007 ebedd5e181 Moved some resources to core 2021-12-31 10:42:10 +00:00
tom lee 357c355e26 Updated core 2021-12-31 17:02:26 +08:00
tom lee faca159721 Updated core 2021-12-31 16:10:13 +08:00
coolGi2007 3556528932 I always forget to update core 2021-12-31 07:22:37 +00:00
coolGi2007 8513e46fdc Abstracting clouds 2021-12-31 17:51:32 +10:30
coolGi2007 323eced2a4 Fixed cloud problems 2021-12-31 17:24:45 +10:30
coolGi2007 6a87539ca3 Made a way to fully disable my clouds. Will be off by defult till clouds are done 2021-12-31 16:12:47 +10:30
coolGi2007 fe725b6795 Extended clouds 2021-12-31 04:55:01 +00:00
tom lee 02862a770f Fixed rebase issues and now it builds again 2021-12-30 22:06:30 +08:00
tom lee a7759ab8e9 Update core and config 2021-12-30 22:04:29 +08:00
cola98765 da1b2051dd made config for minimum back side culling distance. actual value is using prev player pos so on long flights it works better. 2021-12-30 13:19:47 +01:00
tom lee 4fdc596474 Update core 2021-12-29 20:38:13 +08:00
tom lee d0c710b7e1 Update core 2021-12-29 18:19:23 +08:00
tom lee 41ee9dcd99 ExperWorldGen: Hopefully fixed the ArrayIndexOutOfBound in StructStart 2021-12-29 15:10:22 +08:00
tom lee 506ce87f5f Updated core 2021-12-29 13:47:18 +08:00
coolGi2007 08e42ebfe5 Fixed ConfigGui 2021-12-29 16:16:21 +10:30
coolGi2007 699d27afd2 More universal config (works with java 8 & 16) 2021-12-28 10:50:32 +00:00
tom lee 4a64ce0bed Forge Bugfix: Fixed mixins metadata 2021-12-28 15:42:36 +08:00
tom lee b3b94d29b5 Forge Bugfix: Added accesswidener to fix access violations 2021-12-28 15:40:39 +08:00
tom lee 3a30516088 Update core & changed System.out to ClientApi.debug 2021-12-28 15:28:46 +08:00
Ran 6f469737f3 Fix forge's access transformers 2021-12-28 12:58:37 +06:00
coolGi2007 183720d1e5 Updated some config stuff for less crashing 2021-12-28 05:33:18 +00:00
tom lee b2dcc66bd0 update core 2021-12-28 00:10:18 +08:00
tom lee 5c67be30de Updated core 2021-12-27 23:43:46 +08:00
tom lee 4ad4e2c29c BufferUpload: Coresponding to core commit
Changed configs. Also added some more exception logging in
ExperWorldGen. And added a flag to JVM Minecraft to force JVM to always
capture Stack Traces.
2021-12-27 16:09:20 +08:00
cola98765 d1f805d178 optimised setupColorAndTint, specifically part where it calculates if block is gray for no reason if it's not going to be tinted anyway. 2021-12-26 16:08:02 +01:00
cola98765 73071119fa forgot I'm working on wrapper... still, I need color. 2021-12-26 15:41:58 +01:00
cola98765 97c52834f5 fixed SPRUCE and BIRCH leaves, as they require hardcoded biome color. TODO azalea also is like that 2021-12-26 15:36:18 +01:00
coolGi2007 3e472e454a Fixed bugs with ConfigGui 2021-12-26 16:47:28 +10:30
coolGi2007 7ddab31337 Updated comment for config 2021-12-26 03:50:07 +00:00
coolGi2007 fd5b9be523 WAHOO. CONFIG FINALLY SAVES!!! 2021-12-26 03:39:39 +00:00
cola98765 f9dd870067 changed fabric debug key to F8 2021-12-25 13:45:34 +01:00
cola98765 4908acd7ac fixed light requiring Y offset 2021-12-25 13:19:10 +01:00
coolGi2007 87486f6825 Fixed some config stuff. Only 1 more thing to go 2021-12-25 20:52:46 +10:30
tom lee c721c14e27 ExperWorldGen: Added perf logger
set ENABLE_PERF_LOGGING at WorldGenerationStep to true to enable it
2021-12-24 23:44:00 +08:00
tom lee 3521af9792 ExperWorldGen: Make it also works with non Feature 2021-12-24 22:23:02 +08:00
tom lee ff94dba348 ExperWorldGen: Fix major bugs and improved speed 2021-12-24 22:14:04 +08:00
cola98765 31d0a45555 potential fix to cherry leaves (call me if you see gray blocks that should not be gray) 2021-12-24 12:56:00 +01:00
tom lee 41c1473e04 ExperWorldGen: Use ThreadLocal to cache stuff 2021-12-24 17:18:58 +08:00
tom lee d5f12466b2 ExperWorldGen: Fixed World gen on non Overworld 2021-12-24 14:43:07 +08:00
coolGi2007 bdd9ef6b40 Fixed tooltip. Now only the saving is needed to be fixed 2021-12-24 16:14:35 +10:30
James Seibel 9b6895ec68 Refactor and comment ConfigGui 2021-12-23 20:01:53 -06:00
Ran a3854561fc Merge remote-tracking branch 'origin/1.18.X' into 1.18.X 2021-12-23 22:50:32 +06:00
Ran a66df74ec9 BlockEvents 2021-12-23 22:50:06 +06:00
tom lee eb4b31e876 Render: Changed rendered chunk getter to return circles 2021-12-23 18:40:22 +08:00
tom lee 6015b9a1dc ExperWorldGen: Increased timeout for slow CPUs 2021-12-23 18:40:22 +08:00
tom lee 146d42bbe9 Fabric: Added no vanilla fog support.
This isn't availible due to Forge default overrides something. Note that
this noFog also won't work on custom renderer.
2021-12-23 18:40:22 +08:00
Ran 16b14bc424 Add MinecraftForge License 2021-12-23 14:53:58 +06:00
Ran a37e4ca232 Merge remote-tracking branch 'origin/1.18.X' into 1.18.X 2021-12-23 14:47:59 +06:00
Ran 8103c16064 Fix warnings & add License 2021-12-23 14:47:38 +06:00
tom lee 6ae41b0caa ExperWorldGen: Polished stuff. No more error messages. use configs.
I would say this version is the first that is playable.
2021-12-23 16:36:14 +08:00
Ran ba81f31027 Update some stuffs 2021-12-22 22:16:08 +06:00
tom lee 71c72e26e7 ExprWorldGen: Fixed lots of stuff and Features now works!
Still Features exception, which I know how to fix I think.
2021-12-22 23:02:28 +08:00
Ran 97828f465d Server-sided Incoming 2021-12-22 20:32:03 +06:00
Ran ec37803572 Merge remote-tracking branch 'origin/1.18.X' into 1.18.X 2021-12-22 19:47:45 +06:00
Ran b7a54eff7a Explain why this exists 2021-12-22 19:47:22 +06:00
coolGi2007 9604ce297c Fixed not building 2021-12-22 09:53:56 +00:00
Ran 5ad961d80e Delete random log file; Sorry if this was important 2021-12-22 14:02:54 +06:00
Ran 843ec2fef8 Disable run for core & common 2021-12-22 14:01:27 +06:00
Ran 1b3e90b669 Make gradle compatible with Java 17 2021-12-22 13:53:34 +06:00
coolGi2007 55aadb73f1 Fixed the config button on forge menu 2021-12-22 07:07:21 +00:00
coolGi2007 e3d87c70c4 Updated config to be smaller 2021-12-22 05:37:59 +00:00
tom lee 8b1205f79e Fixed Fog color 2021-12-22 11:24:25 +08:00
tom lee 291f5d247c updated core 2021-12-21 21:13:44 +08:00
tom lee ad63825194 ExprWorldGen: Fixed some bugs. Still more to go. 2021-12-21 16:11:57 +08:00
tom lee b0e0cd107d Updated core 2021-12-21 15:49:44 +08:00
tom lee 5f60cd8d4d WorldGen: Added thread timeout failsafe 2021-12-20 14:31:32 +08:00
tom lee d0e17ccab7 Modified a bit of how it determine generation range 2021-12-19 22:35:21 +08:00
tom lee 38a4643cf3 WorldGen: Reversed priority for far vs near 2021-12-19 22:03:15 +08:00
tom lee 938adca022 Changed config for world gen 2021-12-19 21:42:05 +08:00
tom lee e2ec80134e Set the UseUnstable...Config to true by default for now 2021-12-19 21:39:51 +08:00
tom lee 903f166041 ExpWorldGen: Fix DeadLocks, improved cpu utilisations
Now world gen aways try to keep a certain amount of generation events
active.
2021-12-19 18:27:42 +08:00
TomTheFurry a9bdbfda4e Merge branch '1.18' into '1.18.X'
Merge the exprimental world gen

See merge request jeseibel/minecraft-lod-mod!13
2021-12-18 16:40:44 +00:00
tom lee 378349b870 Added experimental world generator. (Features mode only for now)
Turn on the AllowUnstableFeatureGeneration button to enable it. It is a
temp setting and will be renamed later. There will be many issues with
the generator, but at least it for now works... To be fixed tomorrow.
2021-12-19 00:32:42 +08:00
coolGi2007 190ce716ff Forgot to make the forge run client actually run forge 2021-12-17 11:59:05 +00:00
coolGi2007 d2c3a87fa8 Fixed some general stuff that broke when updating to .1.8.1 2021-12-17 11:47:39 +00:00
coolGi2007 2d5acbbf45 Updated to 1.18.1 but also works on 1.18 2021-12-17 08:52:46 +00:00
coolGi2007 4e973099f9 Updated my config 2021-12-17 08:29:14 +00:00
tom lee ee4f43cc59 WorldGen: Now only somewhat lock up server TPS
Use recent change to core so that we no longer request 8 chunk
generations per server tick, but instead just 1.
2021-12-17 16:00:44 +08:00
tom lee 3e64b7400e Updated core 2021-12-17 14:56:29 +08:00
James Seibel c44daa759c Remove the Forge server mod requirement and update the credits 2021-12-16 21:47:23 -06:00
tom lee 17c662b10f Fix -64 offset color bug: Impl' getMinHeight()
It calls works by calling getMinBuildHeight()
2021-12-16 18:39:58 +08:00
tom lee 3cfbb69dd9 Update core & fix Wrappers 2021-12-15 16:45:33 +08:00
tom lee 470668265b Updated core. Cann't test if works, in a hurry. 2021-12-15 00:08:38 +08:00
tom lee b6ced30d70 Updated core 2021-12-14 21:40:15 +08:00
coolGi2007 d3e0f1e14d leetom can you check it works before updating core 2021-12-14 08:36:33 +00:00
tom lee 910350ba3a Update core to use new Renderer system 2021-12-14 15:06:32 +08:00
coolGi2007 8dcf30e776 Updated core 2021-12-13 12:27:28 +00:00
coolGi2007 30d4bcd6a1 Updated config 2021-12-13 12:11:39 +00:00
tom lee 66300cbe70 WorldGen: Fix VersionConstants and more comments
More comments in WorldGenWrapper and fix version constants to always
return true in isWorldGeneratorSingleThreaded()
2021-12-12 23:28:18 +08:00
coolGi2007 50ae719f24 Updatec core 2021-12-12 04:01:04 +00:00
coolGi2007 dccad778fb Updaterd core 2021-12-12 01:44:05 +00:00
tom lee f163e31cd2 WorldGen: Half fixed world gen
Note that currently world gen is single threaded. Below is the current
mapped settings:

BIOME_ONLY -> ChunkStatus.BIOMES : <1 tick
BIOME_ONLY_SIMULATE_HEIGHT -> ChunkStatus.NOISE : <1 tick
SURFACE -> ChunkStatus.SURFACE : <1 tick
FEATURE -> ChunkStatus.FEATURE : 1-2 tick
FULL -> ChunkStatus.FULL : ~ 1-10 tick (?? Probably because of the threaded light engine update)
2021-12-12 02:05:12 +08:00
coolGi2007 5499079ada Updated readme to say to install git 2021-12-11 10:36:25 +00:00
coolGi2007 8d1277db1b Fixed build not building 2021-12-11 09:15:38 +00:00
coolGi2007 34fcac25c2 Updated behind the scenes config stuff 2021-12-11 06:06:10 +00:00
coolGi2007 cb0516cae8 Updated core 2021-12-11 04:05:48 +00:00
cola98765 4fdad05252 Merge branch '1.18' into '1.18'
FIx lightmap flicker on pause menu

See merge request jeseibel/minecraft-lod-mod!12
2021-12-10 10:39:40 +00:00
tom lee dc785b4fe1 Bugfix: Pause menu flicker issue 2021-12-10 17:29:16 +08:00
coolGi2007 8df7e1762a Updated core 2021-12-10 05:22:18 +00:00
coolGi2007 43d9b41648 Updated readme & removed stuff from conig 2021-12-10 01:21:04 +00:00
coolGi2007 880559f94a Updated core 2021-12-10 01:07:27 +00:00
Morippi 6f04ddce87 added the get names 2021-12-09 16:10:47 +01:00
Ran 6eb065f7c9 We do a little bit of coring here 2021-12-09 17:00:34 +06:00
Ran 17ebad9141 Merge remote-tracking branch 'origin/1.18' into 1.18 2021-12-09 16:59:51 +06:00
coolGi2007 9bcc799b0b Fixed forge not building 2021-12-09 10:44:38 +00:00
Ran f247410ae4 We do a little bit of coring here 2021-12-09 16:38:45 +06:00
coolGi2007 2f3bb2ec34 Update readme to be more accurate with architectury 2021-12-09 06:27:24 +00:00
coolGi2007 5c47170ef4 Now uses Architectury and added Forge support 2021-12-09 06:14:30 +00:00
coolGi2007 29d152b312 Updated core (i really need to add a subproject) 2021-12-08 23:54:04 +00:00
coolGi2007 aa48f0f5c6 Might fix windows not working 2021-12-07 05:24:13 +00:00
coolGi2007 05ea683fcf Fixed build problem 2021-12-06 12:39:42 +00:00
coolGi2007 65163a2477 Update Readme.md 2021-12-06 11:43:42 +00:00
coolGi2007 9dc4c46b99 Initual upload to branch 2021-12-06 11:39:57 +00:00
coolGi2007 69029e6f72 Updated core and some general stuff 2021-12-06 06:15:24 +00:00
coolGi2007 faf8579b41 Added custom config 2021-12-06 02:57:56 +00:00
coolGi2007 ed6dff3b5e Updated core 2021-12-03 06:17:38 +00:00
coolGi2007 2dd2623257 Updated config button 2021-12-03 06:17:06 +00:00
coolGi2007 82dfecf04c Updated readme to be more accurate with the current branch 2021-12-02 22:32:57 +00:00
Ran bb5bb23025 Merge branch '1.17.1' of https://gitlab.com/jeseibel/minecraft-lod-mod into 1.17.1 2021-12-02 16:24:00 +06:00
Ran c73e9b3cb5 Update core 2021-12-02 16:23:20 +06:00
coolGi2007 c28ec0b1d8 Update Readme 2021-12-02 09:58:31 +00:00
coolGi2007 a587ac4b4c Fixed the forge and fabric not building and made the gradlew an executable 2021-12-02 09:45:56 +00:00
Ran 0f19b338b6 Update core 2021-12-02 11:31:01 +06:00
Ran 9453e806db SnowAndFreezeFeature 2021-12-02 11:06:55 +06:00
Ran 1bd072bf0a Remove duplicate code 2021-12-01 19:15:30 +06:00
Ran 9315fd6211 Fix forge 2021-12-01 13:25:47 +06:00
Ran 1decb3764f Start porting duplicate code to common 2021-12-01 11:45:03 +06:00
Ran 012312892a Whoops, I forgor 💀 2021-12-01 10:01:49 +06:00
Ran c9f6a753ec Update everything latest & fix some issues & new accesswideners 2021-12-01 01:02:20 +06:00
Ran 9f6e9f791c Fix gradle issues (compiling works again) 2021-11-28 12:22:05 +06:00
Ran a297cdb79a Fix gradle issues 2021-11-28 09:40:54 +06:00
Ran e0ed760cf9 Update core 2021-11-26 23:28:54 +06:00
Ran 1c2549c64f Use HTTPS instead of SSH 2021-11-26 15:47:48 +00:00
Ran 433bc9217d Update .gitmodules 2021-11-26 15:10:40 +00:00
Ran 514e12580d Architectury (pls don't fail me IntelliJ) 2021-11-24 20:22:28 +06:00
James Seibel faf38ef8e3 Add DH-Core 2021-11-22 19:24:33 -06:00
James Seibel 48741a5364 Fix rendering the wrong number of verticies 2021-11-09 20:57:07 -06:00
James Seibel 03ff908de1 Update rendering to OpenGL 3.2+ (buffers seem to be corrupted or missing)
The rendering is almost completely functional, only fog needs to be re-implemented.
2021-11-08 19:45:40 -06:00
James Seibel 5eed9dae40 Add a reminder comment to MixinWorldRenderer 2021-11-08 19:28:16 -06:00
James Seibel 47988ec0da change the todo comment in LodGenWorker 2021-11-08 19:28:03 -06:00
James Seibel b29dac3753 Add a LodRender OpenGL context 2021-10-31 15:52:18 -05:00
James Seibel 3e3e1a7cf2 Update LodBufferBuilder.java 2021-10-31 15:49:30 -05:00
James Seibel 79e6977bab implement BlockPosWrapper offset 2021-10-30 17:21:17 -05:00
James Seibel 0c4ee74254 make the OpenGL proxy capabilities more specific 2021-10-30 17:21:00 -05:00
James Seibel 45d9dbbfcf implement BlockPosWrapper.getWorldPosition 2021-10-30 16:26:12 -05:00
James Seibel 2428449ab4 add a dimension wrapper 2021-10-30 16:15:40 -05:00
James Seibel f863da105b remove the multi-frame color building (it was causing a crash) 2021-10-30 16:15:30 -05:00
James Seibel d63b2c3b12 remove a unused onChange in LodConfig 2021-10-30 16:14:36 -05:00
James Seibel 15496663f3 update gradle for Tukaani.XZ 2021-10-30 16:13:33 -05:00
James Seibel 340631eb9b reformat and update the version number
Forge wants version numbers to start with a number
2021-10-30 13:58:07 -05:00
James Seibel adcd835642 porting - finish compiler errors 2021-10-30 13:47:39 -05:00
James Seibel ff5d2e6047 porting - LodBufferBuilder 2021-10-30 13:32:06 -05:00
James Seibel bd569dad2f porting - test LodWorldGenerator 2021-10-30 13:22:54 -05:00
James Seibel 71ab3196ea remove LodRenderer depreciation warnings 2021-10-30 11:02:23 -05:00
James Seibel b051815b3c porting - LodRenderer 2021-10-30 11:00:24 -05:00
James Seibel 991b3356bb Continue porting process 2021-10-29 23:32:49 -05:00
James Seibel 58ad37c056 Start porting to 1.17.1 2021-10-27 22:42:58 -05:00
James Seibel 65c091bb63 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-27 21:25:09 -05:00
James Seibel 9b389332be update the version number to a1.5.2 2021-10-26 19:26:23 -05:00
Leonardo 1093001841 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-26 23:11:16 +02:00
cola98765 a3db8e50f5 removed NativeImage dependency outside of wrappers. Now LodRenderer only triggers regen without storing lightmap 2021-10-26 23:09:31 +02:00
Leonardo db15e8684c Another small fix to light 2021-10-26 22:44:21 +02:00
Leonardo 00ac368bba fixed light being wrong 2021-10-26 22:38:14 +02:00
Leonardo f2face9782 small change to light value getters in lod builde. Added WorldLightWrapper for future implementation 2021-10-26 21:59:35 +02:00
Leonardo 923d57b377 Fixed the colors in the lodBuilder 2021-10-26 21:46:06 +02:00
Leonardo 447325e5a1 Fixed the colors for now 2021-10-26 21:43:11 +02:00
Leonardo bf712e893e removed default color use from the BlockColorWrapper 2021-10-26 21:28:18 +02:00
Leonardo 27f9a527bc Fixed part of the colors problems 2021-10-26 21:19:09 +02:00
Leonardo bde14012d9 Divided the Block Wrapper in two different class 2021-10-26 12:31:06 +02:00
Leonardo 12a32b9fb4 Implemented the wrappers in the lodBuilder 2021-10-26 11:58:33 +02:00
James Seibel 4ad081e0c6 Add a advanced graphics option to use a extended near clip plain
This prevents some overdraw issues but causes LODs in the ocean to render incorrectly.
2021-10-25 22:20:00 -05:00
James Seibel 936a3a7ece Fix #84 (misaligned LODs in third person) 2021-10-25 21:56:22 -05:00
Leonardo 98f36936d0 smallFix 2021-10-25 22:57:37 +02:00
Leonardo f6f012c42c Added some other classes/methods to the wrappers 2021-10-25 22:51:01 +02:00
Leonardo a3e6c09268 Added more methods to the wrapper 2021-10-25 22:31:43 +02:00
Leonardo 10cb46c9f9 Added biomeWrapper 2021-10-25 21:30:44 +02:00
Leonardo 95aa9cb9ab Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-25 20:20:47 +02:00
Leonardo 638a0ddae1 BlockPosWrapper and BlockWrapper almost completed 2021-10-25 20:20:40 +02:00
James Seibel d321833335 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-25 07:21:26 -05:00
James Seibel b8cba0dc4c increase the near clip plane to 1/5 MC's vanilla render distance 2021-10-25 07:21:17 -05:00
cola98765 bd8ccb4a05 reverted las change, fixed vanillaRenderedChunksChanged at hight altitudes 2021-10-25 13:20:13 +02:00
cola98765 895895da04 update buffers only when lightmap changes. 2021-10-25 12:43:59 +02:00
Leonardo 09d5df2856 Added the main wrapper classes (empty) 2021-10-25 11:14:17 +02:00
James Seibel 668f225528 Fix the blindness potion effect 2021-10-24 23:02:30 -05:00
James Seibel 1cd71a6b50 Re-arange Vanilla Overdraw config options 2021-10-24 22:18:09 -05:00
James Seibel f041f79ae3 Close #78 (Add a config to disable vanilla MC's fog)
And change the config to use FAR fog and disable MC's fog by default.
2021-10-24 22:17:57 -05:00
James Seibel ef3ac96b2c Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-24 21:30:35 -05:00
James Seibel 59f527e6de Update 1.5 release notes.txt 2021-10-24 15:19:59 -05:00
James Seibel 16a082b17f rename "Disable Drawing" to "Enable Rendering" in the config
The config name was incorrect.
2021-10-24 15:19:54 -05:00
jas35484 a24d28b0e2 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-24 14:57:56 -05:00
jas35484 910f11f688 Fix #63 (OpenGL errors)
NVFogDistance doesn't work on low end GPUs which causes the OpenGL error I was seeing with Optifine
2021-10-24 14:57:53 -05:00
cola98765 e00de99e31 Found place where addData was used for adding whole vertical array. We have addVerticalData for that. 2021-10-24 12:11:43 +02:00
cola98765 f80af39e0e halving every array related to worldHeight, as you can't get worldHeight lods, as half of that needs to be a gaps 2021-10-24 11:57:08 +02:00
cola98765 5bba3cb3eb minor cleanup 2021-10-24 11:35:45 +02:00
cola98765 d4261d4ccf a little improvement to 'pow' changes 2021-10-24 11:01:02 +02:00
cola98765 8b854e3abd removed debug message 2021-10-24 10:33:02 +02:00
cola98765 4064155567 changed Math.pow usages with simpler (and possibly faster) x*x and 1 << x. reduced repetitions 2021-10-24 10:28:35 +02:00
cola98765 6243201f2d removed couple Math.floorDiv and Mod as for positive inputs they are slower and give the same result as standard operands 2021-10-24 10:08:12 +02:00
James Seibel c5a2944d68 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-23 12:04:26 -05:00
James Seibel 1405b7a433 Add support for OpenGL 1.5 and 3.0 2021-10-23 12:04:16 -05:00
cola98765 be00670b7e Merge branch 'CodeF53-1.16.5-patch-77785' into '1.16.5'
Update youtube video

See merge request jeseibel/minecraft-lod-mod!5
2021-10-23 13:29:09 +00:00
CodeF53 6f2c02d283 Make link open in new tab 2021-10-23 05:11:10 +00:00
CodeF53 309526e7b9 Update youtube video 2021-10-23 05:01:37 +00:00
James Seibel d5466e0fda Fix a potential null pointer exception when leaving the world
The thread dealing with these should probably be killed and recreated when leaving the world instead of just catching the problem here.
2021-10-22 20:46:26 -05:00
James Seibel 7a0b95a105 minor refactor in LodGenWorker 2021-10-22 20:45:37 -05:00
James Seibel 7c59e33aee remove some commented out code 2021-10-22 20:42:02 -05:00
James Seibel 9907d2ddd5 Temporary null pointer fix 2021-10-22 18:48:32 -05:00
cola98765 1a838d4bd8 pushed FAR fog out by *1.6. I don't know why this number, but it works ok. 2021-10-22 20:07:02 +02:00
cola98765 dce3227bf1 Fixed compression on retail. Don't change your gradle tasks 2021-10-22 08:28:30 +02:00
cola98765 ea6f3e9881 now it's game crashes on launch when build using file made by "shadowJar" option 2021-10-21 16:42:30 +02:00
Leonardo 2f57b67bdc fixed underwater problem with always overdraw 2021-10-21 13:19:23 +02:00
Leonardo be024f524d Fixed regions wall not showing (which would cause holes in the rendering) and added border as possible overdraw config 2021-10-21 12:57:40 +02:00
cola98765 e0a176c0c4 tried to make XZ actually part of the jar 2021-10-21 12:16:39 +02:00
James Seibel b00795a0ab Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-20 22:34:26 -05:00
James Seibel 8bfa8e70a1 Create 1.5 release notes.txt 2021-10-20 22:34:14 -05:00
James Seibel 2a0653419f Update Readme.md
Ah so there is a way to preview this online, that's nice.
2021-10-21 02:21:28 +00:00
James Seibel cc1b9ea28e change the version to a1.5.0 and fix a line in the readme 2021-10-20 21:19:40 -05:00
James Seibel b32bdb3807 Add a acknowledgement for the use of the XZ data compression project 2021-10-20 21:14:15 -05:00
James Seibel 42bac2bd57 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-20 21:07:21 -05:00
James Seibel 9bd89accd3 re-add dynamic overdraw 2021-10-20 21:07:18 -05:00
Leonardo 5493ef9033 removed a print 2021-10-21 02:36:57 +02:00
Leonardo 7d1df26cc5 Shading is only disabled for lod that should be transparent 2021-10-21 02:28:37 +02:00
Leonardo 63f6d4cc56 Fixed chorus plant 2021-10-21 02:17:57 +02:00
James Seibel 6066a572d9 finish two incomplete comments 2021-10-20 18:09:08 -05:00
Leonardo ea679992e8 Small change 2021-10-21 00:40:21 +02:00
Leonardo fedce10917 Overdraw should now be fixed 2021-10-21 00:39:37 +02:00
Leonardo 80448ce990 Small change to the buffer builder 2021-10-20 23:03:13 +02:00
Leonardo 89fac88b7e Added method to check water logged block 2021-10-20 23:02:35 +02:00
Leonardo 032b63208c Added IWaterLoggable blocks to block to use in the generation 2021-10-20 21:23:53 +02:00
Leonardo 9faed3a2c8 Commented the buffer builder and added a method 2021-10-20 20:18:42 +02:00
Leonardo 05800089cb Changed fog enum name 2021-10-20 19:30:42 +02:00
James Seibel 8585511007 Update two of the config overrides 2021-10-19 22:11:11 -05:00
James Seibel 890de58c72 Fix regions culled incorrectly if far from the buffer's center
This would happen if the buffer builder died or was slow
2021-10-19 22:10:28 -05:00
James Seibel 8def361f63 rename LodNodeGenWorker to LodGenWorker 2021-10-19 21:16:58 -05:00
James Seibel 58d5a8beda Update the License header to match the new mod name
LOD -> Distance Horizons
2021-10-19 21:14:57 -05:00
James Seibel 443bb64df0 Improve the wording of the config file 2021-10-19 20:43:43 -05:00
James Seibel 400e00f572 auto-indent 2021-10-19 20:11:31 -05:00
Leonardo 5c36a3df16 Small fix to push and pop of configs 2021-10-19 23:11:39 +02:00
Leonardo 8578a833b4 Fixed crash caused by config 2021-10-19 22:36:01 +02:00
Leonardo 974a9b4452 Small change to configs name + comments 2021-10-19 22:30:23 +02:00
Leonardo d35fbb0bb3 New configs 2021-10-19 22:24:21 +02:00
Leonardo 0551fbb2d4 Small fix to config 2021-10-19 19:15:07 +02:00
Leonardo fe8a847637 Reversed resolution enum order 2021-10-19 19:09:32 +02:00
Leonardo b04eec91bc Fully disabled pre-gen code 2021-10-19 18:50:11 +02:00
Leonardo 6eddef2fb0 simplified block to avoid config 2021-10-19 18:10:59 +02:00
Leonardo 10382342d8 Added some more pre-gen testing code (disabled) 2021-10-19 13:35:22 +02:00
Leonardo 9d80b81378 Now the game doesn't use Biome class to calculate colors 2021-10-19 01:21:25 +02:00
Leonardo 12abc4f018 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-19 01:20:35 +02:00
Leonardo 21e774489c Added the ability to use pregenerated chunks, (bugged still to fix) 2021-10-19 01:20:29 +02:00
cola98765 f6f7f1043e cleaned out code after save compression refactor 2021-10-18 14:32:32 +02:00
cola98765 30e9dd1aac Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-18 11:51:14 +02:00
cola98765 219f3eba17 actually read old files as compressed 2021-10-18 11:50:50 +02:00
Leonardo d737500d95 Added a new section to the LodRegion which may be useful to identify pre-generated chunk in the future 2021-10-18 11:50:38 +02:00
Leonardo 2a402ef1d6 fully disabled the pregen code 2021-10-18 11:47:56 +02:00
Leonardo 84c0fd994d Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-18 11:46:33 +02:00
Leonardo cf782c5b6f changed default thread number 2021-10-18 11:46:23 +02:00
cola98765 96c19620cb now compressing using proper algorithm 2021-10-18 11:00:58 +02:00
cola98765 d0f93a2c89 Fixed light on predicted chunks in caveworld. 2021-10-17 22:15:06 +02:00
Leonardo 85157d0da0 Disabled pre-gen loading for now + small fix 2021-10-17 20:33:28 +02:00
Leonardo 33d150b090 Disabled pre-gen loading for now + small fix 2021-10-17 19:56:29 +02:00
Leonardo e6949dcd14 Fixed shadow with no tree bug 2021-10-17 19:37:06 +02:00
Leonardo b411f083e2 Added config for pre-generated chunk loading 2021-10-17 19:21:56 +02:00
Leonardo d3cd714f48 Added pre-generated chunk loading 2021-10-17 19:17:44 +02:00
Leonardo df0d1483c7 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-17 18:52:40 +02:00
Leonardo 0e82afd6e1 Disabled config override 2021-10-17 18:52:34 +02:00
cola98765 d80253546f fixed chunks resetting after loading save 2021-10-17 16:37:48 +02:00
Leonardo 441e4ff1f2 SmallFix to generation 2021-10-17 14:41:28 +02:00
Leonardo cbdfabeaeb Real chunks are always converted in max quality (could make it a config) 2021-10-17 14:34:39 +02:00
cola98765 bdf7fb3466 fixed blocklight one more time 2021-10-17 13:34:15 +02:00
cola98765 7595248406 cleaned a bit of code 2021-10-17 12:13:17 +02:00
cola98765 b5bcab36cd cleaned a bit of code 2021-10-17 11:53:47 +02:00
cola98765 5ed1e6135b now blocklight also uses server world when applicable 2021-10-17 11:33:07 +02:00
James Seibel 636d4129bd Rename HorizontalQuality LINEAR to LOWEST 2021-10-16 21:38:28 -05:00
James Seibel a90dfb695d Make the config file more easily readable 2021-10-16 21:07:07 -05:00
James Seibel 15c1a64cfd Update the version number to b1.5.0 2021-10-16 20:58:10 -05:00
James Seibel c5f823c54e Add generation Resolution checking to Dynamic vanilla overdraw 2021-10-16 20:56:00 -05:00
James Seibel a7c2e8a6ed Update the config file to use mod name (Distant Horizons) vs the mod id (lod) 2021-10-16 18:48:25 -05:00
James Seibel cb496208f5 If avoiding non full/solid blocks use the above block's color
This fixes snow and flowers not being used.
2021-10-16 18:08:17 -05:00
James Seibel 4ff1815436 Clean up a few compiler warnings 2021-10-16 16:28:57 -05:00
cola98765 31ada4e5d2 No longer removing 1 block gaps as with new lighting it shouldn't look worse 2021-10-16 22:43:25 +02:00
cola98765 accf082309 No longer removing 1 block gaps as with new lighting it shouldn't look worse 2021-10-16 22:42:58 +02:00
cola98765 e1b1f26f37 made project actually build after removing experimental light option 2021-10-16 22:18:24 +02:00
James Seibel a0c14c86ca Improve the lighting on local worlds
ClientWorld apparently doesn't actually know what the lighting is anywhere, so we will have to find another way to determine shadows on servers.
2021-10-16 13:45:31 -05:00
Leonardo a122015f6d Experimental light system is a config now 2021-10-16 15:52:39 +02:00
Leonardo 164d407153 Experimental light system is a config now 2021-10-16 15:51:35 +02:00
cola98765 893bfa096f made new light optional with internal boolean 2021-10-16 11:25:13 +02:00
cola98765 37995af19e fixed flag setting, and changed code back as if isLightCorrect and getBrightness actually worked 2021-10-16 10:39:06 +02:00
James Seibel c637d23121 Merge branch 'CodeF53/minecraft-lod-mod-1.16.5' into 1.16.5 2021-10-15 21:00:54 -05:00
James Seibel d762508188 Only return Minecraft Chunks from the chunkLoadEvent 2021-10-15 20:26:56 -05:00
James Seibel f5437f00a2 slight refactoring 2021-10-15 20:25:33 -05:00
CodeF53 dec20962b2 Switch readme to markdown format, adding headers and misc formatting. 2021-10-15 21:24:32 +00:00
cola98765 30e796f5bf fixed side lighting 2021-10-15 23:20:54 +02:00
cola98765 4ab4dc59e7 now renders default Skylight as 0 when player is in Skylight 0 situation 2021-10-15 18:41:58 +02:00
cola98765 839a76c594 minor adjustment that was annoying me 2021-10-15 17:24:04 +02:00
Leonardo 3fb4d16e41 New sky light handling system (not complete) 2021-10-15 16:23:20 +02:00
Leonardo 002d86af9f Added comment + small refactor + removed TODO 2021-10-15 16:22:41 +02:00
cola98765 e1877f9149 Now using flag bit in data as "is light default" 2021-10-15 15:37:51 +02:00
cola98765 4da1fcc118 since new method of getting skyLight is objectively better, I've commented out old method and 'if' used to switch between those methods 2021-10-14 23:36:27 +02:00
cola98765 af123a8c80 added fast track when we want to add whole column of data, so it doesn't call 5 different methods for each lod block. 2021-10-14 23:33:14 +02:00
cola98765 94bc7fd011 now ignoring isLightCorrect completely, old method is still available 2021-10-14 19:29:50 +02:00
cola98765 905d8bddf3 made new sky lighting calculation optional with internal boolean 2021-10-14 18:56:51 +02:00
cola98765 5ee762cc78 now actually remove garbage vertical lods 2021-10-14 18:51:39 +02:00
cola98765 7c07a88b45 small fix to that light fix 2021-10-14 18:02:58 +02:00
cola98765 d8981af7aa possible fix to skylight... revert if worse than before 2021-10-14 15:11:36 +02:00
Leonardo 9906eb75f4 Changed the Far fog on fancy. Now fog start after the real game render distance 2021-10-14 14:06:11 +02:00
Leonardo d94fedc61e Changed the Far fog on fancy. Now fog start after the real game render distance 2021-10-14 14:02:47 +02:00
cola98765 3e3b979530 indents in LodConfig 2021-10-14 07:49:02 +02:00
James Seibel 6ad94d3362 Update the version number to 1.5.0 and replace the LOD name with Distant Horizons 2021-10-13 23:28:43 -05:00
James Seibel 31f8cecc92 Add the minimum OpenGL version to the readme
BufferStorage technically only requires OpenGL 4.4, but I already had 4.5 written everywhere. If it becomes a problem that going to 4.4 fixes I could probably roll back to that.
2021-10-13 22:04:41 -05:00
James Seibel b4106a8c3c Improve the buffer rebuild logic related to light change 2021-10-13 21:59:46 -05:00
James Seibel b6390c57ef auto-indent 2021-10-13 21:03:03 -05:00
James Seibel 5172c66b9b Merge branch 'CodeF53-1.16.5-patch-87033' into '1.16.5'
Update demo video to latest

See merge request jeseibel/minecraft-lod-mod!3
2021-10-14 01:59:33 +00:00
James Seibel 067fa92419 Improve the logic for vanilla overdraw to work better on different horizontal resolutions 2021-10-13 20:44:38 -05:00
Leonardo 15e80ed063 ceiled dimension now have 64 max render distance + various small changes 2021-10-14 02:29:42 +02:00
Leonardo 2c6549e815 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5
# Conflicts:
#	src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilder.java
#	src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java
2021-10-14 02:28:24 +02:00
CodeF53 32423c07eb Update demo video to latest 2021-10-13 15:03:27 +00:00
cola98765 4a0640a219 cleaned out some code. 2021-10-13 14:27:27 +02:00
cola98765 5f9f20a064 cleaned out some code. 2021-10-13 13:45:23 +02:00
cola98765 ef4ba7208e cleaned out some code. 2021-10-13 13:31:47 +02:00
cola98765 80edf19b33 cleaned out some code. 2021-10-13 13:24:07 +02:00
cola98765 4baa649972 cleaned out some code. Applied autoformat everywhere 2021-10-13 12:45:21 +02:00
cola98765 c7dbc28a9a cleaned out some code 2021-10-13 12:08:47 +02:00
cola98765 707c55653a removed single level container 2021-10-13 12:01:56 +02:00
Leonardo 40cb7f4efc Merge remote-tracking branch 'origin/1.16.5' into 1.16.5
# Conflicts:
#	src/main/java/com/seibel/lod/objects/SingleLevelContainer.java
2021-10-13 11:35:24 +02:00
Leonardo df22a082a1 Added option to avoid block with no collision + removed SingleLevelContainer class use 2021-10-13 11:34:59 +02:00
cola98765 3a7f411aa4 cleaned java ocs in DataPointUtil 2021-10-13 10:36:29 +02:00
cola98765 11c419e503 updated some TODO's 2021-10-13 10:15:48 +02:00
James Seibel 30b82e8009 update dynamic vanilla overdraw in LodUtil 2021-10-12 22:31:51 -05:00
James Seibel 7df4a161dd Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-12 22:20:53 -05:00
James Seibel 56160db7ec comment out the buffer builder expanding console logging 2021-10-12 22:20:44 -05:00
James Seibel ac84c3707a Remove a illegal import 2021-10-12 22:20:27 -05:00
Leonardo d16f571467 Small changed to border shading + changed overdraw ratio 2021-10-12 17:12:31 +02:00
cola98765 d7bd0498a0 When there are no files for current gen mode, try to load more detailed ones instead. 2021-10-12 11:58:21 +02:00
James Seibel 57a2b956dd Improve the VanillaOverdraw config to work better in roofed dimensions 2021-10-11 23:05:49 -05:00
James Seibel 51aadc8d39 Maybe fix a OpenGL error? 2021-10-11 23:00:28 -05:00
James Seibel 70e2f7f3e6 prevent a potential out of bounds exception 2021-10-11 23:00:11 -05:00
James Seibel 0ef8615a98 Extract the main work of the buffer builder into a method for easier hot swapping 2021-10-11 22:12:35 -05:00
James Seibel 4c6412d09f comment out a debug override 2021-10-11 20:55:02 -05:00
Leonardo 27b8cfea09 Fixed the purple color bug 2021-10-11 23:17:20 +02:00
cola98765 b5ab06bfb6 resolved warning 2021-10-11 22:14:56 +02:00
James Seibel 732476b454 Add the overdraw
Overdraw renders LODs on top of vanilla chunks based with  three different settings.
2021-10-10 21:31:45 -05:00
James Seibel 9d1a9eb9f3 Remove the memory estimation code.
Buffers will now be purposely created smaller than expected and then expanded to fit the need.
2021-10-10 14:01:13 -05:00
James Seibel 6018449cbe Quick formatting change and remove a completed TODO 2021-10-10 08:10:05 -05:00
cola98765 8f43695a47 did someone say warnings and typos? 2021-10-10 13:07:23 +02:00
cola98765 30913a0c29 more typos 2021-10-10 11:36:10 +02:00
cola98765 d8cee2b10c Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-10 11:19:09 +02:00
cola98765 33a706f660 autoformat 2021-10-10 11:19:02 +02:00
cola98765 6c2b707c02 autoformat 2021-10-10 11:16:54 +02:00
cola98765 ecb01c731e Resolved "ALOT" of typos. 2021-10-10 11:09:15 +02:00
cola98765 72737a56c1 Resolved more warnings. 2021-10-10 10:38:00 +02:00
cola98765 1d1b5f6115 Resolved more warnings. Applied auto format in affected files. 2021-10-10 10:34:34 +02:00
cola98765 b67ab59a89 Resolved more warnings. Applied auto format in affected files. 2021-10-10 09:50:44 +02:00
cola98765 ca4597e3d9 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-10 08:38:00 +02:00
cola98765 efd9a5a51b merge all 1 block gaps for better look o trees 2021-10-10 08:37:47 +02:00
cola98765 4c3d19a6c6 merge all 1 block gaps for better look o trees 2021-10-10 08:36:45 +02:00
cola98765 6c4faa9103 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-10-10 08:24:05 +02:00
James Seibel 6066957584 Update LodConfig.java 2021-10-09 20:14:51 -05:00
James Seibel c3f8b0b677 Remove the experimental useFovSetting setting 2021-10-09 19:47:26 -05:00
James Seibel e2cdf1549a auto-indent 2021-10-09 19:42:02 -05:00
James Seibel fe9bc5e77e Delete Reference.java 2021-10-09 19:41:22 -05:00
cola98765 ea0ef9e394 boosted skylight prediction to 13 so most trees look better 2021-10-09 23:22:39 +02:00
James Seibel 27d74958bf Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-09 14:48:53 -05:00
James Seibel dc8db97f33 Fix the region at 0,0 (-X,-Z) rendering incorrectly 2021-10-09 14:48:47 -05:00
cola98765 3ec30d49be put guts of mergeSingleData into mergeMultiData and make dataPoint smaller to make it faster 2021-10-09 17:47:58 +02:00
cola98765 627327140e reversed logic in mergeMultiData to improve performance of initial compression to maxVerticalData 2021-10-09 17:07:38 +02:00
James Seibel 2ebbb6f591 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-09 09:46:33 -05:00
James Seibel 126b581e97 Add BufferStorage recreation, improving memory usage
I still want the buffers to be created the right size at the start, but this will work for now.
2021-10-09 09:46:24 -05:00
cola98765 f625e714d4 made mergeMultiData a bit faster 2021-10-09 11:00:59 +02:00
cola98765 5db7e349b9 in mergeMultiData skip empty data 2021-10-09 08:16:58 +02:00
James Seibel 272546af4d Improve the buffer expansion console logging 2021-10-08 22:16:12 -05:00
James Seibel c0a9e3061c reformatting / commenting 2021-10-08 22:13:20 -05:00
James Seibel 5872dc3be5 Fix a memory leak when changing worlds 2021-10-07 22:47:16 -05:00
James Seibel 8fe6eff36c improve the buffer expanding logging 2021-10-07 22:45:48 -05:00
James Seibel d89f2dc9b8 Refactoring / reformatting 2021-10-07 21:34:34 -05:00
James Seibel e0ac03db6c Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-07 21:25:05 -05:00
James Seibel ee58f3d9dc Use OpenGL BufferStorage to improve upload performance
I need to change how the memory is determined, right now they fill to the maximum amount; which is very bad and only for testing.
2021-10-07 20:59:45 -05:00
cola98765 b02d58227c reworked mergeMultiData 2021-10-07 20:17:37 +02:00
Leonardo 61cb27020c small change to a print 2021-10-07 18:03:09 +02:00
Leonardo 443da5eede other config change, set roofed dimension max distance to 64 2021-10-07 17:37:02 +02:00
Leonardo 78ab4b8598 Changed configs 2021-10-07 17:20:39 +02:00
cola98765 028aed53f8 resolved some more warnings and applied autoformat in affected files 2021-10-07 11:17:02 +02:00
cola98765 1ed36ba6c4 resolved some more warnings and applied autoformat in affected files 2021-10-07 11:07:10 +02:00
cola98765 6deca8e235 resolved many warnings and applied autoformat in affected files 2021-10-07 10:36:30 +02:00
Leonardo a6f3c2478e Some refactor + fixed cpu problem with near_first 2021-10-07 00:19:32 +02:00
cola98765 a66554f2dd resolved todo 2021-10-06 11:45:36 +02:00
cola98765 28cf2eb450 removed debug message when saving 2021-10-06 10:37:36 +02:00
cola98765 e154f552c7 fixed bug where only some regions were saved when player was not moving 2021-10-06 10:36:37 +02:00
Leonardo 0c275e1495 Added back the toString in the PosToGenerateContainer 2021-10-05 19:06:51 +02:00
Leonardo 2b15c089f4 Added back the toString in the PosToGenerateContainer 2021-10-05 18:59:40 +02:00
Leonardo fca926bc8f Added some comment, fixed the thread conflict problem 2021-10-05 11:25:06 +02:00
James Seibel f6ea990ab0 Reduce buffer uploading stuttering
I also included commented out versions of several other buffer uploading options and comments on how well they perform.
2021-10-04 22:52:11 -05:00
James Seibel ee6c8d597c Hopefully prevent the buffer builder from dying if an exception is thrown 2021-10-03 14:45:38 -05:00
James Seibel 1e819bd555 temporarily disable transparency in the AbstractLodTemplate 2021-10-03 14:08:55 -05:00
James Seibel a0358dd298 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-03 13:57:34 -05:00
James Seibel 90987fc389 Add a constant to LodUtil and remove a few unused ones 2021-10-03 13:57:24 -05:00
cola98765 f72c846fe5 removed old commented code 2021-10-03 09:42:50 +02:00
James Seibel 2ca8576ad7 auto-indent 2021-10-02 21:33:09 -05:00
James Seibel 0194cffaba auto indent 2021-10-02 21:28:52 -05:00
James Seibel cc52815315 update a override option in the clientProxy 2021-10-02 21:24:19 -05:00
James Seibel 900b67920c re-add transparency rendering 2021-10-02 21:24:04 -05:00
James Seibel 9c1e5c33a5 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-10-02 21:08:22 -05:00
James Seibel d7a1d330d9 Re-add Linux and (hopefully) Mac support
I have tested Windows and Ubuntu (Linux). I didn't test Mac but I am reasonably confident that it should work.
2021-10-02 21:08:15 -05:00
cola98765 3ac05c6a2b fixed multiplyRGBcolors to not make off by 1 error 2021-10-02 15:34:02 +02:00
James Seibel eeff5437b5 Hopefully add Mac and Linux support 2021-10-01 23:25:51 -05:00
James Seibel ee89d6f512 Update the Readme to include IntelliJ install instructions 2021-10-01 07:19:55 -05:00
James Seibel a577851f6b Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-09-30 21:42:00 -05:00
James Seibel 536bff2fe7 Hopefully fix the OpenGL context switching error 2021-09-30 21:41:49 -05:00
James Seibel b1995445e2 auto-format 2021-09-30 19:24:30 -05:00
Leonardo 5d4d483b16 re-added the avoidNonFullBlock and avoidSmallBlock options 2021-10-01 01:26:11 +02:00
Leonardo c13abc3b7d Added thread data for the buffer builder 2021-09-30 19:50:05 +02:00
Leonardo 1cbb15045f Added a reset when unloading and loading world 2021-09-30 19:47:04 +02:00
Leonardo 48ea096ff1 Added comment and changed some small variables 2021-09-30 17:52:51 +02:00
cola98765 2e08b61672 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-30 17:46:59 +02:00
cola98765 b0bb01fde4 reworked ThreadMapUtil to actually save arrays between uses. 2021-09-30 17:46:03 +02:00
Leonardo cc666e917e Now the border chunk only work for render distance higher than 4 2021-09-30 15:26:28 +02:00
Leonardo 9e0abd06fb Better fake chunk/ real chunk blending, less holes 2021-09-30 14:48:52 +02:00
cola98765 0f56a98499 attempt to fix grass colors by setting biome opacity to 255 2021-09-30 13:04:43 +02:00
cola98765 529c52b93f getBuilderArray wasn't initialised correctly causing a lot of new long[] 2021-09-30 12:28:04 +02:00
cola98765 8020b298fb fixed saving transparency and calculating it around biome colors 2021-09-30 11:11:23 +02:00
Leonardo 37db05d18f added a borderChunk finder function 2021-09-30 01:38:39 +02:00
Leonardo 555e5a78b5 simplified the culling (still disabled) 2021-09-30 01:37:48 +02:00
Leonardo 32d492f5f6 Changed some package and added a dimension to the buffer builders 2021-09-29 14:57:43 +02:00
James Seibel d9ee9135d7 revert the config override message 2021-09-29 07:55:46 -05:00
James Seibel d59f9dc4c6 Create pre-release a1.5.1
I made this version so hopefully someone could test if Vivecraft is just ignoring Minecraft's FOV when creating their projection matrices or if they are doing something more complicated.
2021-09-28 22:56:17 -05:00
James Seibel 8f329ac785 auto-format 2021-09-28 22:18:38 -05:00
James Seibel 9865b23e5b Move MAX_ALLOCATEABLE_DIRECT_MEMORY to LodUtil 2021-09-28 21:29:25 -05:00
James Seibel a987149aa3 Create Eclipse Auto Formatting V1.xml 2021-09-28 21:06:15 -05:00
Leonardo 22b7e46d39 small fixes 2021-09-29 02:38:19 +02:00
Leonardo e5c1e67369 Changed various names, changed the memory calculator 2021-09-29 02:16:23 +02:00
James Seibel 328792cf4e Start commenting and refactoring SingleLevelContainer 2021-09-28 07:50:07 -05:00
James Seibel 344901aad5 Comment RegionPos 2021-09-28 07:41:13 -05:00
James Seibel 5f89bd8e7d comment and refactor PosToGenerateContainer 2021-09-27 22:12:55 -05:00
James Seibel 7c5713fac2 Refactor and comment LodWorld 2021-09-27 21:59:51 -05:00
James Seibel d222854717 auto-indent 2021-09-27 21:49:11 -05:00
James Seibel 6b9be10635 Add a few missing comments and refactors to LodRegion 2021-09-27 21:48:19 -05:00
James Seibel 69a72312e4 Refactor and comment LodRegion 2021-09-27 21:43:16 -05:00
James Seibel 948b58d8e9 auto-indent and move a reminder comment 2021-09-27 20:20:26 -05:00
James Seibel 86406fd12b Rename MULTI_LOD to VOXEL 2021-09-27 20:17:33 -05:00
James Seibel cc3e1d1b12 Fix a null pointer and finish commenting/refactoring LodDimension 2021-09-27 20:13:16 -05:00
James Seibel 85a0110af6 comments and regactor LodDimension 2021-09-27 07:59:55 -05:00
James Seibel a76436b73d Bring back the drawLODs config 2021-09-26 08:20:37 -05:00
James Seibel 391c99fd21 comment and refactor LodDimensionFildHandler and ReflectionHandler 2021-09-25 23:51:14 -05:00
James Seibel fb5aceb44d auto-indent 2021-09-25 23:20:05 -05:00
James Seibel 4c76a48e84 Update comments for many enums 2021-09-25 23:17:17 -05:00
James Seibel d7a42d3a51 auto-indent 2021-09-25 20:35:12 -05:00
James Seibel e0a946673e refactor LodBuilderConfig 2021-09-25 20:30:44 -05:00
James Seibel ad793fe17e Refactor and comment LodBufferBuilder and LodBuilder 2021-09-25 18:52:53 -05:00
James Seibel 209e2579c3 refactor and comment LodWorldGenerator 2021-09-25 16:09:29 -05:00
James Seibel 8627b87aa4 auto-indent 2021-09-25 16:09:12 -05:00
James Seibel 5f855dd573 CubicLodTemplate refactoring and commenting 2021-09-25 15:34:39 -05:00
James Seibel d6c918427b have the LodRenderer recreated only when leaving a server 2021-09-25 15:34:25 -05:00
James Seibel a9bdbc4300 Potentially fix a false buffer IndexOutOfBoundsException 2021-09-25 15:32:34 -05:00
James Seibel 58a150f8de fix the ThreadMapUtil not creating arrays correctly 2021-09-25 13:22:31 -05:00
James Seibel 1a3e1dfa8c add get fresh methods to TheadMapUtil
the getFresh versions create/clear the data for the given map.
2021-09-25 11:48:05 -05:00
James Seibel 430a908829 refactor clientProxy 2021-09-25 11:42:49 -05:00
James Seibel 0ca0cd9213 auto-indent 2021-09-25 09:07:07 -05:00
James Seibel 2f392375fe Refactor and Comment Box 2021-09-25 09:04:26 -05:00
James Seibel ff43118976 Update the version number to a1.5.0-pre 2021-09-24 18:06:57 -05:00
James Seibel 3b4e28d74a Add a warning chat message for the 1.5.0 pre-release 2021-09-24 18:05:05 -05:00
James Seibel 13abed4eb8 comment out the shadingMode config since it isn't currently used 2021-09-24 07:59:26 -05:00
James Seibel ccb2c601a6 add a temporary fix to color debug mode not having shading 2021-09-24 07:59:07 -05:00
James Seibel f6816d9974 auto-indent 2021-09-24 07:45:00 -05:00
James Seibel 5156ae8e63 auto-format 2021-09-24 07:43:22 -05:00
James Seibel 55c0c95339 Improve config wording 2021-09-24 07:37:14 -05:00
James Seibel 0b8503f1fa move applyConfigOverrides 2021-09-24 07:27:07 -05:00
James Seibel 79d9ac5d56 auto-indent 2021-09-24 07:26:50 -05:00
James Seibel 6cf4e663fb Fix a potential null pointer exception and improve clientProxy error logging 2021-09-23 22:07:46 -05:00
cola98765 bf9c3ce567 fixed saving multidata in void dimentions 2021-09-23 23:52:34 +02:00
Leonardo 5bbdd22b58 light works again, changed the region_fast option, fixed a indexout of buond, added a TODO for the future for better memery use 2021-09-23 16:02:32 +02:00
Leonardo 6c1c04bb5f Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-23 15:18:39 +02:00
Leonardo 66728cc1eb fixed the memory crash problem.
Added config to draw always in generation quality (if true the game will crash with  render distance>256)
2021-09-23 15:18:33 +02:00
James Seibel d4739b9bed Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-09-23 07:55:44 -05:00
James Seibel a93bb63c44 Fix an index out of bounds exception for vanillaRenderedChunks 2021-09-23 07:55:33 -05:00
Leonardo a2e18de9f3 small fix to generation 2021-09-23 14:38:35 +02:00
Leonardo 6183152d99 small fix to culling 2021-09-23 14:37:57 +02:00
James Seibel 5d9f36bb5f Hopefully fix the openGL errors 2021-09-22 22:26:23 -05:00
James Seibel d330083d7b auto-format 2021-09-22 22:20:03 -05:00
James Seibel 6d489b498e add additional error checking to BufferBuilder vboUpload 2021-09-22 22:16:10 -05:00
James Seibel d36d836bb3 prevent a null point in LodRegion addData 2021-09-22 22:15:42 -05:00
James Seibel 29d2d1cff1 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into
1.16.5

# Conflicts:
#	src/main/java/com/seibel/lod/objects/LodDimension.java
2021-09-22 21:52:03 -05:00
James Seibel 0a9ea1dfce improve the error reporting in GlProxy 2021-09-22 21:50:05 -05:00
James Seibel b9424cbe9f Fix a index out of bounds error in ThreadMapUtil 2021-09-22 21:04:11 -05:00
Leonardo 593a014dfc fixed far and near generation, fixed holes in the rendering in near gen 2021-09-23 02:03:02 +02:00
James Seibel 83ac04dca4 auto-format 2021-09-22 18:33:20 -05:00
Leonardo c9aed389ae various changes to the generation + some small fixes 2021-09-23 01:05:54 +02:00
Leonardo 00da0e0520 Fixed tall grass and flower colors 2021-09-22 21:32:08 +02:00
Leonardo 5124739348 removed reset of bufferBuilder and added better color creation for grass, leaves, water and flowers 2021-09-22 20:47:31 +02:00
Leonardo d65bfd408e Fixed the artifacts (was caused by wrong array initialisation) and added the reset to while changing dimension 2021-09-22 19:38:04 +02:00
Leonardo da413f594e Added different detail drop off option 2021-09-22 17:17:17 +02:00
cola98765 1fcef4be96 some warnings taken care of 2021-09-22 15:10:20 +02:00
cola98765 d7cddd9b39 fixed null check 2021-09-22 15:02:08 +02:00
Leonardo fb480c2695 fix to memory use 2021-09-22 13:17:56 +02:00
James Seibel 265abb64b3 Improve the wording for a few config options 2021-09-21 21:15:02 -05:00
James Seibel 1cf4852788 auto-format 2021-09-21 20:27:55 -05:00
Leonardo 90d0fbe45b various fix to the generation 2021-09-22 01:26:55 +02:00
cola98765 ea9eac89ec podzol netherrack and other blocks now use proper top color without biome color (nether plants might still be broken didn't test it) 2021-09-22 00:26:11 +02:00
cola98765 017cc201b1 enabled save loading for vertical lods 2021-09-21 23:09:48 +02:00
Leonardo bda963036d Introduced correctly spiral generation 2021-09-21 18:35:48 +02:00
Leonardo 46bdf5763f Added spiral generation, changed how some arrays are created 2021-09-21 18:12:15 +02:00
Leonardo 8228a3b7a6 fixed a thread problem 2021-09-21 16:30:53 +02:00
cola98765 e3df6c99da added void and !exist compression to VerticalLevelContainer 2021-09-21 16:18:58 +02:00
Leonardo a4e9e22d2c fixed end bug 2021-09-21 16:09:24 +02:00
Leonardo 435c5ee73a fixed nether roof bug 2021-09-21 15:09:28 +02:00
cola98765 c6b063a380 in SingleLevelContainer made void chunks save as 1 byte instead of 8 2021-09-21 11:34:07 +02:00
cola98765 1f5c3f5bd8 in SingleLevelContainer made void chunks save as 1 byte instead of 8 2021-09-21 11:33:01 +02:00
Leonardo 688cb3f89a New memory getter system 2021-09-20 18:58:02 +02:00
Leonardo af80ff5267 Refactoring 2021-09-20 16:33:24 +02:00
Leonardo 2bc5c43b19 small fix 2021-09-20 15:51:34 +02:00
Leonardo e7c4827d08 Now the single merge use min and max depth and height and no more the mean to make it more consistent with the multi-lod 2021-09-20 15:49:22 +02:00
Leonardo 482dfb918e Refactoring + added the ability to disable lods with f6 2021-09-20 15:44:18 +02:00
Leonardo 5aaf6e0185 removed redundant toString() 2021-09-20 15:23:56 +02:00
Leonardo ab014af15d more refactoring 2021-09-20 15:15:10 +02:00
Leonardo 772de1b869 Refactoring, removed unused class/enum, fixed a small array bug 2021-09-20 14:59:42 +02:00
Leonardo cb42683774 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-20 14:01:28 +02:00
Leonardo a00698ccab added the dataPoint to the threadMaputil 2021-09-20 14:01:18 +02:00
cola98765 29ed26f023 More warnings addressed 2021-09-20 13:31:16 +02:00
cola98765 af3c4ab801 More warnings addressed 2021-09-20 13:23:22 +02:00
cola98765 1156b7dd28 now using ThreadMapUtil for temp array during saving 2021-09-20 12:50:49 +02:00
cola98765 25fd29b97e replaced short[][] with short[] in mergeMultiData hotfix 2021-09-20 12:16:47 +02:00
cola98765 a11ff5b493 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-20 12:13:32 +02:00
cola98765 7655ae03b0 replaced short[][] with short[] in mergeMultiData 2021-09-20 12:13:24 +02:00
Leonardo 075e29c617 small fixes for better gc use 2021-09-20 12:09:45 +02:00
cola98765 e482bf02a5 fixed negative numbers in mergeMultiData 2021-09-20 11:57:32 +02:00
cola98765 0dab4a2274 addressed couple warnings 2021-09-20 11:54:01 +02:00
cola98765 001335ab47 I'm stupid 2021-09-20 11:46:47 +02:00
Leonardo faedb85f41 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-20 11:35:31 +02:00
Leonardo 01b9a3f3b0 Fixed culling 2021-09-20 11:35:20 +02:00
cola98765 cfd9bd903d + 1 will not hurt anyone 2021-09-20 11:34:25 +02:00
cola98765 3e634c082a addressed couple warnings 2021-09-20 11:30:56 +02:00
cola98765 6e86a808a5 addressed couple warnings 2021-09-20 11:12:54 +02:00
cola98765 e615674246 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-20 11:03:48 +02:00
cola98765 86b5fc48a2 addressed couple warnings 2021-09-20 11:03:24 +02:00
Leonardo 2fab33fa78 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-20 10:57:28 +02:00
Leonardo b56b581bb6 Refactoring 2021-09-20 10:57:20 +02:00
cola98765 2ee5289881 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-20 10:56:36 +02:00
cola98765 3da4e4818c replaced arraycopy in mergeMultiData in favor of simpler method for debugging 2021-09-20 10:56:28 +02:00
Leonardo 686062f39c Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-20 10:46:25 +02:00
Leonardo ae857dfeae fixed a small bug in the datapoint
Simplified the code in the LodBufferBuilder
2021-09-20 10:46:14 +02:00
cola98765 686592effb fixed bug in loading vertical data 2021-09-20 10:43:12 +02:00
James Seibel 34b92d1053 Fix #67 (LODs not rotating with camera) and #68 (LODs culled based on player direction, not camera) 2021-09-19 19:25:01 -05:00
James Seibel 01a850eb9d Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-09-19 18:14:09 -05:00
James Seibel 7d6f7f35ff Fix the buffer builder failing on LodQualityMode.HEIGHTMAP 2021-09-19 18:13:48 -05:00
James Seibel 28764bc16c auto-format 2021-09-19 17:58:22 -05:00
Leonardo ee1657a798 fixed a small bug 2021-09-19 23:58:24 +02:00
cola98765 c7bf60b4e0 fixed byte cast 2021-09-19 23:34:55 +02:00
cola98765 031af5f25c Merge branch '1.16.5' of https://gitlab.com/jeseibel/minecraft-lod-mod into vertical_merging
 Conflicts:
	src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java
	src/main/java/com/seibel/lod/util/DataPointUtil.java
2021-09-19 23:31:16 +02:00
Leonardo d8200422b2 disabled the clear + small change 2021-09-19 23:18:31 +02:00
cola98765 c89cd54429 implemented multi level saving and loading. they use new long[] system instead of long[][][] 2021-09-19 23:16:03 +02:00
cola98765 ca940d5a36 reworked mergeMultiData to take in long[] instead of long[][] 2021-09-19 22:59:15 +02:00
Leonardo 2241492bc5 there is a thunderstorm i don't want to loose progress 2021-09-19 22:08:30 +02:00
Leonardo 7b807bcea2 small changes 2021-09-19 21:32:13 +02:00
Leonardo ebe2c22a28 Changed how the VerticalLevelContainer contains the data 2021-09-19 20:48:07 +02:00
cola98765 cffb17aeb1 reversed grass brightness boost as it's better that way at 4+ view distance 2021-09-19 16:35:47 +02:00
cola98765 c67a5a5e29 removed commented and now unused code 2021-09-19 16:25:53 +02:00
cola98765 1d687fd1d4 new mergeMultiData. Now actually working 2021-09-19 14:44:55 +02:00
cola98765 783d4086c6 some fixes to new mergeMultiData 2021-09-19 14:40:06 +02:00
cola98765 d5243b7d16 some fixes to new mergeMultiData 2021-09-19 14:18:42 +02:00
cola98765 43f3854068 some fixes to new mergeMultiData 2021-09-19 11:41:29 +02:00
cola98765 0025f43a2e Merge branch '1.16.5' of https://gitlab.com/jeseibel/minecraft-lod-mod into vertical_merging
 Conflicts:
	src/main/java/com/seibel/lod/util/ThreadMapUtil.java
2021-09-19 10:36:33 +02:00
James Seibel 07d792979c downgrade to frogeGradle 3.+ from 5.1.+
mixins weren't compiling correctly on the newer version
2021-09-18 23:34:15 -05:00
James Seibel a939d29357 hopefully prevent a index out of bounds exception 2021-09-18 17:44:52 -05:00
James Seibel ba1d096a48 Add error catching / logging 2021-09-18 17:44:37 -05:00
James Seibel 1c9c72cfe3 Clean up a lot of warnings related to: type casting, unused variables, and unused imports 2021-09-18 17:06:41 -05:00
James Seibel aa95361866 Refactor LodDimension and change some error reporting in PosToRenderContainer 2021-09-18 16:58:23 -05:00
James Seibel ff5139d403 Remove debug code and fix a potential OpenGL error 2021-09-18 14:52:14 -05:00
James Seibel 16fc4914fb Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-09-18 14:13:05 -05:00
James Seibel c110524c11 fix vanillaRenderedChunks having index out of bounds exceptions 2021-09-18 14:12:54 -05:00
James Seibel 400b263059 Try to fix GlProxy.setGlContext failing in the BufferBuilder 2021-09-18 14:12:33 -05:00
Leonardo dadda4bdc9 Disabled the culling until it's fixed 2021-09-18 17:32:34 +02:00
Leonardo 1888ac7adc Fixed the culling coordinate 2021-09-18 17:09:13 +02:00
James Seibel 5c59ba7a80 Prevent a error related to loading textures on a null clientWorld 2021-09-18 09:39:53 -05:00
James Seibel f3dd99e792 Improve error message in GlProxy 2021-09-18 09:38:51 -05:00
Leonardo 103ec128ac small fix 2021-09-18 14:46:18 +02:00
Leonardo b4226ec9ec small fix 2021-09-18 14:46:06 +02:00
Leonardo 7c28dd70d3 Fixed the culling 2021-09-18 13:58:19 +02:00
Leonardo d8c9a41314 fixed face culling 2021-09-18 10:09:35 +02:00
Leonardo 5a7f77479f Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-09-18 10:09:14 +02:00
James Seibel d200a5ac24 Add the ability to disable direction based culling
This is a band aid fix for #68, hopefully a better solution can be found in the future.
2021-09-17 23:33:21 -05:00
James Seibel 5099f85da6 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into
1.16.5

# Conflicts:
#	src/main/java/com/seibel/lod/render/LodRenderer.java
2021-09-17 23:11:28 -05:00
James Seibel 6e150fe378 Update to ForgeGradlew from 3.+ to 5.1.+ 2021-09-17 22:58:09 -05:00
James Seibel fd67d1ac66 Change setupProjectionMatrix to be mc version agnostic
Now the LOD projection matrix's zoom, transformation, distortion, etc. are all gotten dynamically from Minecraft's projection matrix.
Hopefully this should prevent camera mods from breaking the mod.
2021-09-17 22:57:20 -05:00
cola98765 7161bd52de reworked mergeVerticalData... not actually working 2021-09-18 00:09:22 +02:00
Leonardo 82cf25c341 fixed colors 2021-09-17 23:37:16 +02:00
Leonardo 68d279807f small fix to the vertex order 2021-09-17 22:50:48 +02:00
Leonardo 3530158def Added new culling system 2021-09-17 22:37:33 +02:00
Leonardo 62223480e2 Fixed nether roof 2021-09-17 16:58:59 +02:00
Leonardo 50ab424497 added regen for the lightmap 2021-09-17 15:57:01 +02:00
Leonardo 900467cef2 System uses lightmap now 2021-09-17 13:02:05 +02:00
cola98765 fa1d950ff9 grass is actually using texture now 2021-09-17 12:55:14 +02:00
Leonardo 83571951be Added the ability to get the top texture 2021-09-17 12:29:57 +02:00
Leonardo c31b1f4039 added the ability to avoid not full block or small block 2021-09-17 11:14:23 +02:00
James Seibel 8fcd428194 improve error handling and error messages related to contexts 2021-09-16 20:32:32 -05:00
James Seibel 87c275f768 Add improved error reporting and commenting 2021-09-16 20:32:03 -05:00
James Seibel 8df6e972cb Fix a out of memory error when changing worlds 2021-09-16 20:28:07 -05:00
James Seibel d7d88d61ee Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into
1.16.5

# Conflicts:
#	src/main/java/com/seibel/lod/wrappers/MinecraftWrapper.java
2021-09-16 19:05:05 -05:00
James Seibel 9b1c0a1125 Add the ability to access the lightmap from the MinecraftWrapper 2021-09-16 19:03:43 -05:00
cola98765 b008b70255 colors are better than it were... again 2021-09-17 00:05:29 +02:00
cola98765 b6c350f667 colors are better than it were 2021-09-16 22:21:04 +02:00
Leonardo e23bbfcd91 small changes 2021-09-16 18:53:26 +02:00
cola98765 6bc14fbb2d brightness fix with real block colors TODO foliage 2021-09-16 18:12:22 +02:00
Leonardo d911017112 new color for grass, leaf and water 2021-09-16 17:11:08 +02:00
Leonardo fc4546538f Reintroduced manual color for nether blocks 2021-09-16 16:17:38 +02:00
Leonardo a90b3e9d37 Merge remote-tracking branch 'origin/1.16.5_new_file_handling' into 1.16.5 2021-09-16 16:15:29 +02:00
Leonardo b2aca27615 Added texture mean in lod builder 2021-09-16 15:44:28 +02:00
cola98765 6bf9e187e0 this breaks old file version system by simply ignoring the old files. 2021-09-16 11:41:53 +02:00
James Seibel b5f32705e8 remove commented out code 2021-09-15 23:12:10 -05:00
James Seibel 8bc72af63f Improve rendering performance and improve buffer building stability
Specifically improve the rendering speed so we can get over 100 fps again.
2021-09-15 22:01:52 -05:00
Leonardo 0e4cf8e882 added a TODO in data util 2021-09-15 17:02:44 +02:00
Leonardo 5ede5fa202 Added fake lighting system. Improved some point 2021-09-15 16:17:26 +02:00
Leonardo cdeba2616c Re-Introduced HEIGHMAP mode correctly.
Added single get and add to the LevelContainer to avoid using temp arrays
2021-09-15 13:23:41 +02:00
Leonardo 6dc94b0cc2 Introduced lodQualityMode in config to change from 3d to 2d 2021-09-15 10:42:09 +02:00
James Seibel 7f9c7d8722 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into
1.16.5

# Conflicts:
#	src/main/java/com/seibel/lod/builders/LodBufferBuilder.java
2021-09-14 23:46:01 -05:00
James Seibel aebbeb6ade Simplify the multi-context uploading, improve stability, and refactor 2021-09-14 22:49:08 -05:00
James Seibel a945eb4579 Fully add multi-context uploading 2021-09-14 21:27:36 -05:00
Leonardo f9cf27a2c7 Changed the dataPoint, started the introduction of the lightmap use 2021-09-14 23:21:48 +02:00
Leonardo e03e09a243 Fixed various bugs and introduced more maps in the ThreadMapUtil 2021-09-14 19:02:37 +02:00
Leonardo fe02813d17 Disabled a section in the getNearbyLodChunkPosToSkip 2021-09-14 13:45:08 +02:00
Leonardo 145479267d Fixed Nether color 2021-09-14 13:15:36 +02:00
Leonardo 77ccd9eec3 changed how the valid block is determined, and added a mask and a shift for future use 2021-09-14 12:58:09 +02:00
Leonardo 9b216fedad Vertical lod now works (optimization required) 2021-09-14 01:05:41 +02:00
Leonardo e9798ace13 kinda working version 2021-09-13 23:23:55 +02:00
Leonardo 75e78d9000 First vertical data working 2021-09-13 17:34:37 +02:00
Leonardo 34776074fd added the vertical merge 2021-09-13 13:16:52 +02:00
James Seibel 8822e2d8a1 partially add different context rendering 2021-09-12 23:14:43 -05:00
Leonardo 32de70b4f0 Removed the normals 2021-09-13 01:48:11 +02:00
Leonardo 76a7baeb32 Saving works again 2021-09-13 01:47:04 +02:00
Leonardo 95d9c17e49 Added new colors for the torches 2021-09-13 01:19:39 +02:00
Leonardo a6544d3bb6 Introduced light and added normal in the template for future shading improvement 2021-09-13 00:37:23 +02:00
Leonardo c3115caa8f Re-organized the LodBuilder code 2021-09-12 16:29:41 +02:00
Leonardo 4e1e5b24ee Changed the lodBuilder to use a single function 2021-09-11 20:05:11 +02:00
Leonardo 7b73445f4d Changed the lodBuilder to use a single function 2021-09-11 19:59:30 +02:00
Leonardo 5f1f5f0948 Fixed some smalls bugs 2021-09-11 16:29:20 +02:00
Leonardo bdcc4c7755 Introduced map util and now the Loading does not create new String object. 2021-09-11 15:56:46 +02:00
Leonardo 1395e32a50 introduced the mergeSingleData function 2021-09-11 13:49:51 +02:00
Leonardo 99f7d70613 disabled the class until it's ready 2021-09-10 18:22:13 +02:00
Leonardo 59bfd739f4 Added max detail at FULL 2021-09-10 18:21:46 +02:00
Leonardo 3f1cf6c305 Added some new temporal data storing 2021-09-10 18:21:09 +02:00
Leonardo 5c05df0361 changed the thread names 2021-09-10 18:20:33 +02:00
Leonardo feebc3564a Created the single level container 2021-09-10 16:42:21 +02:00
Leonardo a9aa630aff Started convertion for vertical data 2021-09-10 15:47:43 +02:00
James Seibel 6ec146ba60 re-add depreciation warning suppressions 2021-09-09 19:06:09 -05:00
Leonardo 21140593e2 Started convertion for vertical data 2021-09-10 01:05:12 +02:00
Leonardo 878714dae3 Fixed the lod not showing at screen corner bug 2021-09-09 15:51:14 +02:00
Leonardo e876d7bec6 Fixed the lod not showing at screen corner bug 2021-09-09 14:43:04 +02:00
Leonardo 4f06395557 Fixed glass color 2021-09-09 14:36:05 +02:00
Leonardo aa3dbe8f32 Fixed the allocation of long[] 2021-09-09 14:10:45 +02:00
James Seibel b1bcdb24f0 comment out the config override for release a1.4.1 2021-09-08 18:30:37 -05:00
James Seibel cbd7f4300e Improve logging wording 2021-09-08 18:17:36 -05:00
James Seibel 4d8e30121e fix a spelling mistake 2021-09-08 18:17:17 -05:00
James Seibel fbe39542fc update the version number to a1.4.1 2021-09-08 18:13:25 -05:00
James Seibel 6a1f448b41 comment out testing code 2021-09-08 18:13:06 -05:00
James Seibel e13b23832c Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-09-08 18:09:15 -05:00
James Seibel 4c9e0edf32 Add barrier blocks to the list of blocks to ignore 2021-09-08 18:08:59 -05:00
Leonardo 8664a06d3b fixed a small bug that was causing visual artifacts 2021-09-08 19:38:17 +02:00
James Seibel 18b8359f0d rename the wrapper package to wrappers 2021-09-07 21:12:58 -05:00
James Seibel 7de4c7c72a Make the reflection handler a singleton 2021-09-07 21:12:16 -05:00
James Seibel b4bbabae42 enable debugging settings in ClientProxy 2021-09-07 19:52:27 -05:00
James Seibel 40321d6e21 Remove unused variables, imports, etc. 2021-09-07 19:52:06 -05:00
James Seibel cf1702bd0c Fix file reading/writing not working, Closes #61 2021-09-07 19:38:41 -05:00
James Seibel a9b50cdb32 remove invalid imports / organize imports 2021-09-07 19:10:30 -05:00
James Seibel 7eed472029 Fix stuttering caused by a merge 2021-09-07 19:09:50 -05:00
James Seibel 0262e452c7 Improve FileHandler info message 2021-09-07 19:04:48 -05:00
James Seibel 30287d5a7d Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-09-07 18:54:41 -05:00
James Seibel 83346fed1f Improve the error messages in the LodDimensionFileHandler 2021-09-07 18:54:24 -05:00
Leonardo e897c3edba fixed generation 2021-09-08 00:51:39 +02:00
Leonardo bd9e2acaf6 Changed the default heigth and depth and small fix to the culling 2021-09-08 00:23:44 +02:00
Leonardo 1e15d372c4 Added box caching 2021-09-07 21:22:12 +02:00
Leonardo 849d563425 Added box to replace AxisAlignedBB 2021-09-07 20:07:39 +02:00
Leonardo aa5a8aa3b8 small change 2021-09-07 19:05:58 +02:00
Leonardo b096cc53aa Working version 2021-09-07 19:02:51 +02:00
Leonardo 94d994e761 re-added the commit 2021-09-07 18:52:58 +02:00
Leonardo f76fa17e25 Removed level pos and data arrays 2021-09-07 17:23:22 +02:00
James Seibel 53a66268cb Close issue #37 (z-fighting far from the origin)
I'm not certain why in LodRenderer swapBuffers has to be called after the frame has been rendered, but otherwise it causes stuttering / rubber banding.
2021-09-06 22:51:46 -05:00
James Seibel 139867d4b8 auto-indent 2021-09-06 12:17:49 -05:00
James Seibel 81cf05ba19 fix a issue where nothing renders in the compiled version 2021-09-06 11:55:44 -05:00
James Seibel 13a1e7ed56 Add the MinecraftWrapper 2021-09-06 11:20:32 -05:00
James Seibel 42bd0fbde9 Delete 1.4 release notes.txt 2021-09-05 17:25:46 -05:00
James Seibel ebe2bd97bc Remove the compiled jars (they are now handled by CurseForge) 2021-09-05 16:51:26 -05:00
James Seibel a3ac3386d0 Update 1.4 release notes.txt 2021-09-05 16:50:42 -05:00
Leonardo 69ba83d34f small change to far Fog 2021-09-05 16:15:14 +02:00
James Seibel e048d277f8 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-09-04 11:01:26 -05:00
James Seibel 0bca47a92b Update pack.mcmeta
I don't even know if we need this file
2021-09-04 11:01:05 -05:00
James Seibel ce84b30ddb Change a println to use the logger 2021-09-04 11:00:54 -05:00
Leonardo 1843f96526 various fix to the new classes 2021-09-04 12:48:22 +02:00
Leonardo e46864431b Fixing the new classes 2021-09-03 23:33:54 +02:00
Leonardo 152a3fa108 Optimized the generation memory use 2021-09-03 22:35:08 +02:00
Leonardo 3420133bd3 Added LevelPosUtil, PosToGenerateContainer and PosToRenderContainer to be used in the future 2021-09-03 19:34:04 +02:00
Leonardo c79bf7c3f7 Fixed chunk data generation during first world loading 2021-09-03 13:10:16 +02:00
James Seibel 2219da4050 revert the fog changes 2021-09-01 21:47:31 -05:00
James Seibel a1aa90cccb Split up the configs to make it easier to understand 2021-09-01 21:39:02 -05:00
Leonardo d19abaef7b small fix to a bug that was causing crash if the player went over y 256 2021-09-01 18:20:51 +02:00
Leonardo 77625c65c7 small fix 2021-09-01 18:11:25 +02:00
Leonardo 91ba48ad4a Max draw detail now works correctly and node bigger than a chunk do not disappear if you touch a border 2021-09-01 18:11:01 +02:00
Leonardo 32e587d536 Small fix to the index of vanillaRenderedChunks 2021-09-01 17:27:37 +02:00
Leonardo e3dfe658f5 Fixed chunkPos being created multiple time in the buffer 2021-09-01 17:20:52 +02:00
Leonardo 4e249e943a Revert "Added LevelPosUtil, now the node are added using it and not with the LevelPos object"
LevelPos are useful and the small stutter in the buffer builder is probably caused by the creation of ChunkPos
2021-09-01 16:33:34 +02:00
Leonardo 1360edb459 Added LevelPosUtil, now the node are added using it and not with the LevelPos object 2021-09-01 15:15:23 +02:00
James Seibel 4c7ca395c6 Add the buffer rebuild timeouts to ClientProxy.applyConfigOverrides() 2021-08-31 21:14:19 -05:00
James Seibel a1c720d588 Fix a issue where the projection matrix was given a depth of 0
This caused the depth buffer to stop working.
2021-08-31 21:05:53 -05:00
James Seibel 7b09840d02 Organize inputs 2021-08-31 19:26:17 -05:00
Leonardo e65579f346 temporary fix to the missing region bug 2021-08-31 18:08:02 +02:00
Leonardo 78d6481a49 Another small fix 2021-08-31 12:55:42 +02:00
Leonardo 1428e72d46 small fix to the generation 2021-08-31 11:47:18 +02:00
James Seibel 2c2c6d6785 Add configs for buffer building timeouts and small refactors 2021-08-30 23:16:27 -05:00
Leonardo d5d48f2448 now the vanillaRenderedChunk is reset if the player goes to high 2021-08-30 23:41:56 +02:00
Leonardo 536de1a22d fixed a small error with the timer 2021-08-30 23:25:37 +02:00
Leonardo 193c579712 changed the generation. Added re-use of levelPos 2021-08-30 23:03:22 +02:00
Leonardo cdba7b20f5 Buffer that does not change won't be rebuilt 2021-08-30 17:55:34 +02:00
Leonardo 5467d007b8 preparing the mod for future buffer caching 2021-08-30 12:36:07 +02:00
Leonardo b24d691d8a Removed a useless temp Object in the getNodeToRender 2021-08-30 10:36:15 +02:00
James Seibel f68e6a9a13 Add a config option to disable the F4 keybinding 2021-08-29 21:23:16 -05:00
James Seibel 2dcdc854e3 Improve stone color 2021-08-29 21:09:30 -05:00
James Seibel 42da213ea9 Update the mod meta info 2021-08-29 16:35:59 -05:00
James Seibel dfea2f561a Replace the old logo files with the new logo files 2021-08-29 14:32:19 -05:00
James Seibel d8b4730ee0 Remove a unneeded depreciation suppression warning 2021-08-29 14:20:18 -05:00
Leonardo 74cbf794a1 the culling in templace can be disabled using the disableCulling boolean 2021-08-29 18:22:41 +02:00
Leonardo 812fa65054 divided the time checker for the regen 2021-08-29 17:18:21 +02:00
Leonardo ba63b44288 small change 2021-08-29 16:44:36 +02:00
Leonardo b19a80f411 Optimized the regen 2021-08-29 16:42:44 +02:00
Leonardo 450f15ad36 Finally fixed the regen problem 2021-08-29 10:56:14 +02:00
James Seibel a6ed4968f5 Add a config option for the number of buffer builder threads 2021-08-28 23:38:51 -05:00
James Seibel 65dc629771 Remove a unsettable configOverride 2021-08-28 23:38:16 -05:00
James Seibel 80aa49e28b Update 1.4 release notes.txt 2021-08-28 23:37:34 -05:00
James Seibel 2c3149ef30 Fix a potential issue with compiling to the wrong Java version 2021-08-28 17:15:38 -05:00
James Seibel cd792d7045 Fix a potential crash where Setupbuffers isn't called fast enough for the BufferBuilder 2021-08-28 17:13:17 -05:00
Leonardo 3ade43651f small Optimization to the buffer 2021-08-28 20:55:18 +02:00
Leonardo f4c3ad8bb5 Fixed the garbage collector being called too much 2021-08-28 20:32:58 +02:00
James Seibel 13d2c7b421 Create the comment for issue #62 2021-08-28 12:10:19 -05:00
James Seibel c54c2c6612 Remove the unused parameter in getBufferMemoryForSingleLod() 2021-08-28 11:55:48 -05:00
James Seibel 13878b7387 auto-format 2021-08-28 11:27:20 -05:00
James Seibel 2f20fc6b77 Update the default config options 2021-08-28 11:18:19 -05:00
James Seibel d4ada067c5 auto-indent 2021-08-28 11:05:33 -05:00
James Seibel 9277b3ad38 Add different debug modes (off, detail, detail_wireframe) 2021-08-28 11:04:59 -05:00
James Seibel c48d409015 remove the unused enum LodQuality 2021-08-28 10:18:23 -05:00
James Seibel ccdebb4242 auto-indent 2021-08-28 10:18:05 -05:00
James Seibel 18c94cea46 Update known issues 2021-08-28 10:09:32 -05:00
James Seibel fe381fc207 Rearrange ClientProxy and fix a potential saving issues 2021-08-28 10:07:20 -05:00
James Seibel acc73af666 Remove some debugging 2021-08-28 10:00:11 -05:00
Leonardo 685284f131 removed some e.printStack for the release 2021-08-28 13:40:39 +02:00
Leonardo f803bd58af fixed server not overriding lower quality 2021-08-28 13:21:50 +02:00
Leonardo 26fbdfc92c fixed memory use method and put F4 as debug key 2021-08-28 12:41:54 +02:00
Leonardo e3e8ef705a geneartionType is no longer used in LodRegion. Every region has a generationMode (+ server) 2021-08-28 12:22:09 +02:00
Leonardo e1a425dbcc fixed a small generation errore,
Now cut and gen tree are automatic
2021-08-28 11:15:34 +02:00
Leonardo d8bd4e2347 Fixed a small loading bug,
made the getDataToGenerate fully automatic, added an option to update the DetailDistanceUtil values
2021-08-28 10:38:44 +02:00
James Seibel 49cdd5702f Add 1.4 release notes
This also includes bugs that need to be fixed before 1.4 can be released
2021-08-27 21:25:26 -05:00
James Seibel 32c19eab7f move a comment 2021-08-27 20:59:41 -05:00
James Seibel a32b66aaab organize imports 2021-08-27 18:05:27 -05:00
James Seibel 425f4948dc Remove unneeded imports and a unneeded cast 2021-08-27 18:05:02 -05:00
James Seibel d05908af32 Auto-formatting 2021-08-27 18:04:50 -05:00
Leonardo 822a088096 fixed loading 2021-08-28 00:36:45 +02:00
Leonardo 36079e1624 fix to the Rendering holes 2021-08-28 00:16:44 +02:00
Leonardo 8db782a406 Now nodeToRender is fully automatic 2021-08-27 23:05:37 +02:00
Leonardo dd018f90d3 Small change 2021-08-27 18:47:42 +02:00
Leonardo af4e30588f new z fix 2021-08-27 18:27:37 +02:00
Leonardo 2630d50147 temporary z fix 2021-08-27 17:43:17 +02:00
Leonardo db2410e7fe changed indent 2021-08-27 14:34:43 +02:00
Leonardo 9990132db2 small changes 2021-08-27 14:31:13 +02:00
Leonardo 21069d6479 Optimization to getLodToRender 2021-08-27 12:02:02 +02:00
Leonardo b27afbb18c Optimized the getDataToGenerate 2021-08-27 11:34:55 +02:00
Leonardo 783c0c97a1 Preparing the BufferBuilder for new system 2021-08-27 11:28:29 +02:00
Leonardo 3dfa2d778a Fixed end bug 2021-08-27 10:59:24 +02:00
James Seibel b44a641d96 Add a TODO 2021-08-26 22:59:55 -05:00
James Seibel 8139b83a01 Fix heights saving higher then they are 2021-08-26 21:01:59 -05:00
James Seibel 456ba183da Fix updating regions where LODs contain no blocks 2021-08-26 20:28:48 -05:00
James Seibel 7525c1b257 Fix the "ffffff" error when reading files 2021-08-26 19:37:38 -05:00
James Seibel 5d4d634537 Re-add the Number Of World Generation Threads config option 2021-08-26 19:31:33 -05:00
James Seibel e1149be7c1 add a missing closing comment "/" 2021-08-26 18:14:49 -05:00
Leonardo fc0aaac69f added better shading + small changes 2021-08-27 00:54:46 +02:00
Leonardo 9786a12273 Fixed a small bug with getDataToGenerate 2021-08-26 23:34:14 +02:00
Leonardo c169cb6b7f Changed how color are calculated 2021-08-26 23:02:32 +02:00
Leonardo afcdce4667 Small fix to LevelPos 2021-08-26 20:17:00 +02:00
Leonardo ab7ed9a4c5 Optimized getDataToGenerate 2021-08-26 20:13:32 +02:00
Leonardo 120e8e5f6d small fixes and changed settings 2021-08-26 19:33:59 +02:00
Leonardo 65824a6fed fixed fog 2021-08-26 19:33:32 +02:00
Leonardo 114aaf9fe4 Update doesn't use temp object anymore 2021-08-26 19:33:15 +02:00
Leonardo 347b149037 The generation is working now 2021-08-26 17:41:01 +02:00
Leonardo 70317a37cb fixed LevelPos and colors 2021-08-26 14:28:27 +02:00
Leonardo 74e4744ff7 Correctly removed LodDataPoint and optimized the LevelPos use 2021-08-26 13:18:18 +02:00
Leonardo 98cbc30709 Small changes to how number of thread is chosen and returned to old LINEAR system 2021-08-25 16:12:18 +02:00
Leonardo b44900e3f0 Added new render/generation distance calculator 2021-08-25 13:44:53 +02:00
Leonardo 1755a252b1 Fixed how request works 2021-08-25 13:13:48 +02:00
Leonardo afcedd0c6d Improved how LINEAR is determined 2021-08-25 13:13:27 +02:00
Leonardo 525005bcb6 small changes to how the node to render are chosen 2021-08-25 12:26:16 +02:00
Leonardo 360294d37c fixed the generation Request 2021-08-25 12:24:59 +02:00
Leonardo ea05e3f9e6 fixed the cull 2021-08-25 12:24:01 +02:00
Leonardo 70a75f0543 added an offset to the cull 2021-08-25 11:09:49 +02:00
Leonardo 488d520b8f Improved the template, shared faces are not rendered 2021-08-25 10:55:05 +02:00
Leonardo 30bb175ea0 small changes 2021-08-25 08:17:39 +02:00
Leonardo 500a68e0fc Merge remote-tracking branch 'origin/1.16.5' into 1.16.5
# Conflicts:
#	src/main/java/com/seibel/lod/builders/LodBufferBuilder.java
#	src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java
#	src/main/java/com/seibel/lod/proxy/ClientProxy.java
2021-08-25 07:59:57 +02:00
James Seibel 0cd9bfaef2 Put all LOD save files in the same folder 2021-08-24 21:48:09 -05:00
James Seibel a464176a25 Close #32 (make distance generation independent of the buffer builder) 2021-08-24 21:47:51 -05:00
James Seibel a0dcde48ae Remove unneeded TODOs and unused code 2021-08-24 18:31:42 -05:00
Leonardo 8ae81d3aac added some debugging comments 2021-08-24 23:11:14 +02:00
Leonardo c4f864f0e3 changed how the distance generation mode is determined and added
zFix boolean in node to render to disable the zFighting fix
2021-08-24 23:10:29 +02:00
Leonardo cddd239fc5 Introduced try and catch were needed and fixed some small bugs 2021-08-24 14:58:22 +02:00
Leonardo 189b0ec878 Now the system work stable with SINGLE 2021-08-24 02:35:25 +02:00
Leonardo bd305a0269 small fixes to tree generator new tree cutter 2021-08-24 01:54:01 +02:00
Leonardo bbf99ed145 fixed tree generator new tree cutter 2021-08-24 00:33:46 +02:00
Leonardo cac4807986 Added tree generator and new tree cutter 2021-08-23 23:44:55 +02:00
Leonardo 181539b83b small fixes 2021-08-23 16:05:21 +02:00
Leonardo 4795ddd1ff Fixed circle generation bug 2021-08-23 15:33:51 +02:00
Leonardo c1c6680d04 small changes 2021-08-23 14:20:09 +02:00
Leonardo 81cbc7a12b added the big update function 2021-08-23 12:36:32 +02:00
Leonardo 4c6185556f Small fixes 2021-08-23 12:10:55 +02:00
Leonardo b0ed460230 small fix to the tree cutter 2021-08-23 11:45:15 +02:00
Leonardo 38e323a12f small fix to the tree cutter 2021-08-23 11:24:06 +02:00
Leonardo 9840c594e6 Added the tree cutter 2021-08-23 11:12:23 +02:00
James Seibel fdd8204a46 Add multi-threaded buffer building 2021-08-22 22:54:16 -05:00
James Seibel fb188e4819 auto indentation 2021-08-22 18:46:47 -05:00
James Seibel 9b3d9cbba3 javadoc formatting 2021-08-22 18:46:22 -05:00
James Seibel a2aa1dd081 add a lock to the buffer builder when the buffers are being used
Hopefully this should prevent some crashes and errors when generating buffers
2021-08-22 18:42:27 -05:00
James Seibel cb889d7430 auto formatting 2021-08-22 18:26:59 -05:00
James Seibel 2a88b2e746 Remove a unused method 2021-08-22 18:25:58 -05:00
James Seibel 93dd441708 Close #60 (LODs rendering on top of the player) and improve get Lod pos to skip 2021-08-22 18:24:41 -05:00
James Seibel a81ce6c28a auto reformat 2021-08-22 17:55:24 -05:00
James Seibel 967627c57e Move getRenderedChunks to LodUtil 2021-08-22 17:54:10 -05:00
Leonardo 31cb684bec Added different generation detail option 2021-08-22 19:54:10 +02:00
Leonardo d5112be385 small fixes 2021-08-22 19:18:14 +02:00
Leonardo 547d54aab1 Fixed the near clipping 2021-08-22 16:54:09 +02:00
Leonardo 397573bc08 removed lodChunkRadiusMultiplier from proxy, config and renderer 2021-08-22 16:46:55 +02:00
Leonardo b52d7e4f20 small fix to the Near fog 2021-08-22 16:33:20 +02:00
Leonardo a450f44aa7 small fix to the fog 2021-08-22 16:20:27 +02:00
Leonardo a4e8e9ef60 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5
# Conflicts:
#	src/main/java/com/seibel/lod/proxy/ClientProxy.java
2021-08-22 16:09:07 +02:00
Leonardo 3c28ed5601 small fix to fog 2021-08-22 16:06:30 +02:00
James Seibel c5ec41eb2d Add buffer recreation when changing worlds 2021-08-22 08:42:55 -05:00
Leonardo d1bb96c2dc small fix 2021-08-22 14:46:16 +02:00
James Seibel d72ba5bb82 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-22 07:40:09 -05:00
James Seibel baba54bdb8 Add error reporting and handling when unable to access the save folder 2021-08-22 07:40:00 -05:00
Leonardo aa7ea85cde New config 2021-08-22 14:34:02 +02:00
Leonardo a1f01bef78 Fixed game chunk not overriding lod chunk 2021-08-22 11:51:26 +02:00
Leonardo 1a7655e752 Added DetailUtil and it's use in the buffer builder +
small fixes
2021-08-22 11:27:40 +02:00
James Seibel e2a983e4ac comment grammar change 2021-08-21 21:54:40 -05:00
James Seibel e2f0263643 Remove synchronized from getters 2021-08-21 21:54:23 -05:00
James Seibel b280303f8f Improve vine colors 2021-08-21 20:06:22 -05:00
James Seibel ff3b2aee6b Add error catching and improve the None distance generation mode 2021-08-21 20:02:30 -05:00
James Seibel 804f830a10 fix third person backwards culling the wrong regions 2021-08-21 19:57:03 -05:00
James Seibel 68b5978135 Change the color of Mycelium to better match its block color 2021-08-21 19:45:43 -05:00
James Seibel 9ebb84bf9c Make air and Cave air act the same when generating LODs 2021-08-21 19:25:31 -05:00
James Seibel a08e08856a Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into
1.16.5

# Conflicts:
#	src/main/java/com/seibel/lod/builders/LodBufferBuilder.java
2021-08-21 18:57:39 -05:00
James Seibel 8d5c8bf7b8 Finish adding simple frustum culling 2021-08-21 18:54:20 -05:00
Leonardo 168eb537cb Improved generation 2021-08-21 22:21:41 +02:00
James Seibel ca57c15d46 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into
1.16.5

# Conflicts:
#	src/main/java/com/seibel/lod/builders/LodBufferBuilder.java
2021-08-21 15:19:04 -05:00
James Seibel 5aea9877e0 re-organize RenderUtil 2021-08-21 15:11:13 -05:00
Leonardo c20ec4ef59 added commented use of biomeUtils and terrainUtils 2021-08-21 22:01:52 +02:00
James Seibel 32fb349621 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-21 13:05:35 -05:00
James Seibel c5b4e20787 Add simple partially functioning frustum culling 2021-08-21 13:05:32 -05:00
James Seibel a246dd7561 improve a few comments 2021-08-21 13:02:21 -05:00
James Seibel 615e29451a add conversions to chunk and block pos 2021-08-21 13:01:39 -05:00
James Seibel bcac2bd7ba Update a few comments 2021-08-21 13:01:24 -05:00
Leonardo a02c232f5f improved getDataToGenerate and changed how it's used in the buffer builder 2021-08-21 17:28:11 +02:00
James Seibel d27dbbb64e Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into
1.16.5

# Conflicts:
#	src/main/java/com/seibel/lod/builders/LodBufferBuilder.java
2021-08-21 10:06:44 -05:00
James Seibel fdfbee108a minor client proxy debug setting changes/commenting 2021-08-21 09:57:14 -05:00
James Seibel de54c37cf1 Optimize Buffer Builder chunk generator queuing 2021-08-21 09:55:04 -05:00
Leonardo d4580806d1 minor fixes, fixed z fighting 2021-08-21 16:25:09 +02:00
James Seibel 5a856c65fa Update the debug colors to work up to region size 2021-08-21 08:03:35 -05:00
James Seibel 75d6da98dc Remove invalid imports (again) 2021-08-21 07:36:49 -05:00
Leonardo 7654cac01d minor fixes 2021-08-21 14:33:11 +02:00
James Seibel cbe242cd2f Remove invalid import 2021-08-21 07:23:55 -05:00
Leonardo 7f69b11ae4 minor fixes 2021-08-21 12:43:38 +02:00
Leonardo 426c9edb05 new generation system fixed 2021-08-21 12:25:49 +02:00
James Seibel 88fb9b5b21 Add debug code to the LodNodeGenWorker 2021-08-20 21:32:57 -05:00
James Seibel 163f8ca979 Remove Node from the names of LodRenderer, BufferBuilder, LodTemplates, and LodBuilder 2021-08-20 20:28:37 -05:00
James Seibel ee416a10ec Add null checking to the BufferBuilder 2021-08-20 20:24:33 -05:00
James Seibel c5ef03aa0e Add null checks and minor formatting changes 2021-08-20 20:19:46 -05:00
James Seibel 25cb08f541 Eclipse auto-formating 2021-08-20 20:19:05 -05:00
Leonardo fcd06bde87 fixed getDataToGenerate use in buffer builder,
Fixed buffers indexing
2021-08-21 02:57:57 +02:00
Leonardo 00f50a2e60 Added getNodeToGenerate to the buffer builder 2021-08-20 19:46:46 +02:00
Leonardo 550c0f1bf2 Added getDataToRender to the bufferBuilder 2021-08-20 19:02:11 +02:00
Leonardo 0f0179bd19 Various fix 2021-08-20 17:06:41 +02:00
Leonardo 7885d14a91 getDataToRender and getDataToGenerate added to dimension 2021-08-20 16:35:38 +02:00
Leonardo bd9c3bba3f added getDataTeRender 2021-08-20 16:07:27 +02:00
Leonardo 04f8cd653a getDataToGenerate should work correctly 2021-08-20 15:03:28 +02:00
James Seibel 02bfc20ae6 Fix small mushrooms using the grass color 2021-08-20 07:34:14 -05:00
James Seibel d65017366a comment out the buffer building time console printing 2021-08-20 07:25:52 -05:00
James Seibel 05d17ba9fa Close #57 (Add support for night vision) 2021-08-20 07:25:22 -05:00
Leonardo 967aab3b3b new line brackets 2021-08-20 11:46:41 +02:00
Leonardo 9f77bf4e61 Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-08-20 11:32:21 +02:00
James Seibel 6aa096de57 Remove an incorrect import 2021-08-19 19:41:56 -05:00
Leonardo d312d60cd9 Fixed loading not working, started the creation of dataToGenerate and dataToRender 2021-08-20 00:50:08 +02:00
Leonardo 65fde550cb Small fix to the position 2021-08-19 15:49:36 +02:00
Leonardo 736b5ba625 new enum for render distance and quality of lods 2021-08-19 12:47:54 +02:00
Leonardo b2227688bc Merge remote-tracking branch 'origin/1.16.5' into 1.16.5 2021-08-19 11:31:40 +02:00
Leonardo cbe8b647b1 New fast save system 2021-08-19 11:31:26 +02:00
James Seibel 0b0f0eab2f Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-18 17:37:38 -05:00
James Seibel ffb63ce8ef Move the setupBuffers method to the ClientProxy 2021-08-18 17:37:23 -05:00
Leonardo 0e6f5d9805 Changed the save system
Now lod render distance and quality are not dependent on game render distance
2021-08-18 23:54:13 +02:00
Leonardo a0bd9648dc Conversion to new quad tree LodRegion 2021-08-18 19:46:56 +02:00
James Seibel aa1778cf82 Remove the direct memory Buffer limit
Now the LOD multiplier won't be lowered when the detail is increased.
2021-08-17 22:44:50 -05:00
Leonardo 10d66a4775 LodRegion now works (might still have bugs) 2021-08-16 23:03:21 +02:00
Leonardo 4082c97e0e LodRegion update (not yet complete) 2021-08-16 18:45:42 +02:00
Leonardo 665f979e82 LodRegion update (not yet complete) 2021-08-16 14:23:26 +02:00
Leonardo 911205ce0a Create the new LodRegion class that will replace the quadTrees 2021-08-16 12:24:49 +02:00
James Seibel 51078fde5b Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-15 19:39:55 -05:00
James Seibel adde7e8d67 Add a ThreadFactory to name executor threads 2021-08-15 19:38:51 -05:00
Leonardo 582e38eec5 Added the ability to change the save type to bin (slower method at the moment) 2021-08-16 00:05:24 +02:00
James Seibel e987e679d0 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into
1.16.5

# Conflicts:
#	src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java
2021-08-15 15:14:43 -05:00
James Seibel 6d776407a4 Optimize the BufferBuilder 2021-08-15 14:52:17 -05:00
Leonardo 8a61a5f0e7 Slightly optimize addLodToBuffer 2021-08-15 16:40:13 +02:00
James Seibel 49a9ff8640 Re-add the render.drawLODs method to clientProxy
Ops.
2021-08-15 08:32:00 -05:00
James Seibel 47ebdb4aee Remove BiomeContainer from BufferBuilder
Having it prevents server use
2021-08-15 08:19:00 -05:00
James Seibel 2b10a9d977 Remove objectSizeCalculator Java Mission Control is much better 2021-08-15 07:50:31 -05:00
James Seibel 247b7d5633 Add toString methods 2021-08-14 21:01:27 -05:00
James Seibel ae9eba0608 Add distanceGenerationMode when generating nodes 2021-08-14 19:56:16 -05:00
James Seibel 7983681b70 Update the config 2021-08-14 18:13:08 -05:00
James Seibel 85d4106f28 Add a try catch to LodQuadTreeDimension 2021-08-14 18:08:47 -05:00
James Seibel 22d329b8aa remove illegal state exception in LodQuadTreeWorld
This fixes an exception being thrown when leaving the world.
2021-08-14 18:02:25 -05:00
James Seibel 004d36ffa7 Remove old commented out code 2021-08-14 18:01:35 -05:00
James Seibel 231340d979 Comment out debug code 2021-08-14 17:38:40 -05:00
James Seibel f55f5b881f Optimize the region distance logic 2021-08-14 17:26:47 -05:00
James Seibel 03ac090e06 Refactor and improve the comments in LodNodeBufferBuilder 2021-08-14 17:26:28 -05:00
James Seibel 3b375e9c1b minor spacing change 2021-08-14 17:22:59 -05:00
James Seibel e44157fae5 Update / Fix RegionPos 2021-08-14 17:22:44 -05:00
James Seibel 997513231c Improve variable naming in LodNodeRenderer 2021-08-14 16:00:12 -05:00
James Seibel 64c3ba297b Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-14 09:34:01 -05:00
James Seibel 3ae9c49de4 Improve file writing logic 2021-08-14 09:33:46 -05:00
Leonardo 5692f9fa69 Added the cutTreeAtLevel method 2021-08-14 15:52:14 +02:00
Leonardo 72ba9f5699 Added the cutTreeAtLevel method 2021-08-14 15:50:44 +02:00
James Seibel 696be6f796 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-14 08:20:09 -05:00
James Seibel 5198335948 Improve LOD saving logic 2021-08-14 08:19:44 -05:00
Leonardo 8102063850 Added the cutTreeAtLevel method 2021-08-14 15:17:03 +02:00
Leonardo 86bf551de8 Lod not saving fix 2021-08-14 15:04:54 +02:00
Leonardo ec2933f23c Fixed generation detail not being used 2021-08-14 14:14:26 +02:00
James Seibel f6daf62c7d Add a Size calculator class 2021-08-13 23:35:41 -05:00
James Seibel 50988db28c Use a lower level biome generation method 2021-08-13 23:34:53 -05:00
James Seibel 047cef184d Update TODO comment 2021-08-13 23:34:23 -05:00
James Seibel ee5b8662d1 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-13 18:01:25 -05:00
James Seibel 9470ee2507 Add KaptainWutax TerrainUtils to build.gradle 2021-08-13 18:00:06 -05:00
James Seibel 8f63e755be Rename saveRegionToDisk to saveRegionToFile 2021-08-13 17:59:33 -05:00
Leonardo b0d62da7fe Remove QuadTreeImage and remove the start, center and end field from the LodNode 2021-08-13 20:25:28 +02:00
James Seibel 7a4347b288 Fix the try catch block in LodNodeGenWorker
Try catch finally blocks need catch to work properly, who knew.
2021-08-12 21:00:35 -05:00
James Seibel bbaa583a6d Fix a config typo 2021-08-12 19:41:09 -05:00
James Seibel c3709f726c Improve how distance based quality is determined 2021-08-11 21:52:16 -05:00
James Seibel d1417069d9 Remove the old LOD objects 2021-08-11 07:33:51 -05:00
James Seibel 412f1bead0 Start removing the old LOD objects 2021-08-11 07:29:51 -05:00
James Seibel 1095f63832 Remove unneeded code in LodDetail 2021-08-10 21:19:14 -05:00
James Seibel 89d0317c7f Add full detail to the LodNodeBufferBuilder 2021-08-10 21:15:34 -05:00
James Seibel 4f489a5272 Change the distance debug colors 2021-08-10 21:14:52 -05:00
James Seibel 8c843ba4b5 Fix the Full detail mode 2021-08-10 21:14:33 -05:00
James Seibel 77401cbfa0 Auto Reformat 2021-08-10 21:14:04 -05:00
James Seibel b983692fc1 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-10 20:49:42 -05:00
James Seibel e1a40c6868 Add a comment to LodNodeBufferBuilder 2021-08-10 20:47:28 -05:00
James Seibel 9c2add4e3b Clean up distance based detail and change debugMode 2021-08-10 20:34:06 -05:00
Leonardo 8cede4760e reduced quality to improve performance 2021-08-11 01:46:11 +02:00
Leonardo bceab238d5 Small fix to the offset 2021-08-11 01:45:18 +02:00
James Seibel 121676e661 Remove a unneeded offset in LodNodeBufferBuilder 2021-08-10 17:44:44 -05:00
Leonardo 9ec3be8a48 Added different level 2021-08-10 17:23:43 +02:00
Leonardo bb61cdad70 Added different LodDetail support 2021-08-10 17:11:36 +02:00
Leonardo 2e32e4d768 LodNodeBuilder and LodNodeGenWorker now support correctly LodDetail 2021-08-10 13:07:59 +02:00
Leonardo d4ee641362 Fixed file saving not working 2021-08-10 12:28:32 +02:00
James Seibel 953c2b2e92 Improve color generation and fix Biome Only generation 2021-08-09 22:25:49 -05:00
James Seibel 2cc78c874b Remove comment for issue #54 2021-08-09 22:23:47 -05:00
Leonardo f6f0ecb21b Fixed negative region not showing 2021-08-09 17:54:04 +02:00
Leonardo 190fef934c Added getNodeAtPos for generic node level 2021-08-09 17:01:31 +02:00
James Seibel 52608a9f3f Create issue #54 2021-08-08 22:06:45 -05:00
James Seibel 54e5fd30ab Refactor and comment 2021-08-08 22:04:13 -05:00
James Seibel 89115fd5d5 Add a text reminder when overriding the config file 2021-08-08 21:48:13 -05:00
James Seibel 5631ae52be Refactoring and Commenting 2021-08-08 16:41:25 -05:00
James Seibel 6520cdb184 Refactoring and commenting 2021-08-08 16:30:04 -05:00
James Seibel ce5f8708cd Remove unused code in LodNodeBuilder
I don't think using a 3rd party generator is a good idea; even if it is much faster than vanilla MC.
For a couple of reasons:
1. we could run into issues where the 3rd party isn't updated fast enough
2. the 3rd party generator may not generate the same terrain/biomes/etc.
3.  we wouldn't be able to generate mod terrain
2021-08-08 16:25:42 -05:00
James Seibel 270a83ddbc Refactoring and Commenting 2021-08-08 09:58:55 -05:00
James Seibel 64b8cb3556 Refactoring, reformatting, and commenting
I removed the getters from LodQuadTreeNode since they were public variables anyway.
2021-08-08 00:09:12 -05:00
James Seibel 7f7884c130 update LodNodeBufferBuilder version date 2021-08-07 23:38:14 -05:00
James Seibel 5a95613cee spacing reformatting 2021-08-07 23:38:00 -05:00
James Seibel 9a58800499 Refactoring and commenting 2021-08-07 23:31:40 -05:00
James Seibel d68e46a2d0 Refactoring 2021-08-07 19:31:31 -05:00
James Seibel 20d1ff6d49 revert LodQuadTree region to LodQuadTree and other refactors 2021-08-07 18:30:36 -05:00
James Seibel ed188448f2 Fix LodNodeBufferBuilder queueing the same chunk for generation multiple times 2021-08-07 18:29:20 -05:00
James Seibel 87c803e4c6 Minor refactoring 2021-08-07 13:40:04 -05:00
James Seibel 58f51aae91 reword a TODO 2021-08-07 13:36:15 -05:00
James Seibel 97a773176d Refactoring fixes 2021-08-07 13:30:03 -05:00
James Seibel f6d92021ed Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-07 13:29:05 -05:00
James Seibel 026cbd5da3 add fix from 2d70e8eb 2021-08-07 12:33:34 -05:00
James Seibel 3538e79a6b Reformat, Refactor, and add comments 2021-08-07 12:22:49 -05:00
Leonardo d520fb8535 previus fix was not correct 2021-08-07 19:03:56 +02:00
Leonardo d7dbf8b994 Fixed the repeating region bug 2021-08-07 18:56:51 +02:00
Leonardo 2d70e8ebe2 Fixed the repeating region bug 2021-08-07 18:54:10 +02:00
James Seibel 5eafe8f818 Improve formatting and a few variable names 2021-08-05 21:42:58 -05:00
James Seibel e875c664fd fix LODs generating multiple times (at least in single threaded gen) 2021-08-05 21:41:08 -05:00
James Seibel e313a03410 Fix/improve rendering again 2021-08-05 20:40:12 -05:00
James Seibel 781aa339bc Partially fix LodNode rendering 2021-08-05 07:56:00 -05:00
James Seibel 73e318ee38 Merge branch '1.16.5' of gitlab.com:jeseibel/minecraft-lod-mod into 1.16.5 2021-08-04 23:07:12 -05:00
James Seibel 337853cdfa Start merging in 1.16.5_QuadTree
The mod does compile and render, however distance LODs don't generate or render correctly and there are other problems as well.
2021-08-04 23:07:03 -05:00
Leonardo bc8188beb0 Added important TODOs 2021-07-21 10:43:51 +02:00
Leonardo 0fc4c5532b Minor fixes 2021-07-19 17:00:40 +02:00
Leonardo 98586d6af9 now different generation setting can be used in the same Dimension without conflict 2021-07-19 16:23:14 +02:00
Leonardo bdd1e2410a Updated the guide 2021-07-19 11:47:26 +02:00
Leonardo c0240c71bf Updated the guide 2021-07-19 11:46:22 +02:00
Leonardo 65ffc93e0f Updated the guide 2021-07-19 11:35:38 +02:00
Leonardo 01183be383 getLevelToGenerate has been renamed getNodesToGenerate. Now it return node and not the complete level 2021-07-19 11:32:20 +02:00
Leonardo 359791ea58 Fixed getLevelToGenerate. Now it works correctly 2021-07-19 11:26:05 +02:00
Leonardo 5b3aa82817 Updated the image creation 2021-07-14 15:08:10 +02:00
Leonardo d77bb48da1 Updated the guide 2021-07-14 15:07:09 +02:00
Leonardo 8b941cb95c Updated the guide 2021-07-14 14:41:03 +02:00
Leonardo b9d991db63 Updated the guide 2021-07-14 14:37:48 +02:00
Leonardo 1a8a7be494 Updated the guide 2021-07-14 14:33:58 +02:00
Leonardo d054ac91b1 Fixed all negative coords bug 2021-07-14 14:33:17 +02:00
Leonardo e40ee20460 Added GUIDE to Readme.txt 2021-07-14 11:14:44 +02:00
Leonardo 29b3e9fadc The lodQuadTree is now correctly converted to use LodDataPoint and DistanceGenerationMode 2021-07-13 20:40:55 +02:00
Leonardo 3cc78c62a0 The lodQuadTree is now correctly converted to use LodDataPoint and DistanceGenerationMode 2021-07-13 15:38:20 +02:00
Leonardo 2c719c41d9 Various change to support LodDataPoint and the DistanceGenerationMode enum 2021-07-13 11:38:08 +02:00
Leonardo cd06b42b02 changed pc 2021-07-13 00:53:24 +02:00
Leonardo e8b46a6fd2 Converting the quadTree to use the LodDataPoint class 2021-07-13 00:52:24 +02:00
Morippi 7854f659a3 various change 2021-07-10 15:02:26 +02:00
Morippi 6cb1d2f8f4 second fix for negative coordinate 2021-07-10 13:36:15 +02:00
Morippi f95d57ab6d Several chages to converto to quadTree + first fix for negative coordinate 2021-07-10 12:43:23 +02:00
Morippi f91479829d Several chages to converto to quadTree 2021-07-09 21:07:00 +02:00
Morippi 829c9531fa Several chages to converto to quadTree 2021-07-09 21:01:37 +02:00
Morippi f9bb248eef Several chages to converto to quadTree 2021-07-09 21:01:17 +02:00
Morippi 03ce4d9c42 Several chages to converto to quadTree 2021-07-09 19:23:14 +02:00
Morippi f181d073a3 fixed LodQuadTreeDimension 2021-07-09 17:56:44 +02:00
Morippi 63b01f3ec7 fixed LodQuadTreeDimension 2021-07-09 15:53:32 +02:00
Morippi 14f1b6db54 fixed LodQuadTreeDimension 2021-07-09 15:26:03 +02:00
Morippi 604089cfa8 fixed LodQuadTreeDimension 2021-07-09 15:08:48 +02:00
Morippi 712d9db2fa fixed LodQuadTreeDimension 2021-07-09 14:58:48 +02:00
Morippi 2b5b023472 fixed LodQuadTreeDimension 2021-07-09 13:33:11 +02:00
Morippi 4a9bc7ca74 fixed LodQuadTreeDimension 2021-07-09 13:11:25 +02:00
Morippi 804f910584 added region in image + various fix 2021-07-08 19:31:27 +02:00
Morippi d5b2512e27 various fix 2021-07-08 13:00:29 +02:00
Morippi 280d281604 various fix 2021-07-08 12:52:50 +02:00
Morippi 95bcc71d23 various fix 2021-07-08 12:40:36 +02:00
Morippi b623f1581f various fix 2021-07-07 23:12:45 +02:00
Morippi 62b6d9ea30 Modified to used getNodeToRender 2021-07-07 22:44:53 +02:00
Morippi 6c8d0f98a6 Added circular rendering,
Fixed get node to render
2021-07-07 22:43:44 +02:00
Morippi dc353cd029 Map works correctly 2021-07-07 21:16:18 +02:00
Morippi 86e4ab7e83 Map works correctly 2021-07-07 20:22:05 +02:00
Morippi c6a96ae710 Fixed QuadTreeImage 2021-07-07 19:44:10 +02:00
Morippi 9e24ee0ef7 Fixed LodQuadTree
Added QuadTreeImage to visualize how the quadTree is builded
2021-07-07 00:53:32 +02:00
Morippi 72bcc87de7 QuadTree version, still doesn't work 2021-07-05 14:46:51 +02:00
284 changed files with 25345 additions and 7850 deletions
+19
View File
@@ -0,0 +1,19 @@
**/.git
**/.gitlab
**/.cache
buildAllJars
**/_Misc Files
*.bat
*.md
*.sh
*.txt
coreSubProjects/*.md
coreSubProjects/*.txt
**/.gitignore
**/.gitattributes
**/.gitlab-cy.yml
**/.gitmodules
+701
View File
@@ -0,0 +1,701 @@
# DH Main
root = true
# Note: please keep this and the core .editorconfig in sync
[*]
charset = utf-8
end_of_line = crlf
indent_size = 4
indent_style = space
insert_final_newline = false
max_line_length = 1000
tab_width = 4
trim_trailing_whitespace = false
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = true
ij_smart_tabs = false
ij_visual_guides = none
ij_wrap_on_typing = false
[*.java]
indent_style = tab
ij_smart_tabs = true
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
ij_java_align_group_field_declarations = false
ij_java_align_multiline_annotation_parameters = false
ij_java_align_multiline_array_initializer_expression = false
ij_java_align_multiline_assignment = false
ij_java_align_multiline_binary_operation = false
ij_java_align_multiline_chained_methods = false
ij_java_align_multiline_deconstruction_list_components = false
ij_java_align_multiline_extends_list = false
ij_java_align_multiline_for = false
ij_java_align_multiline_method_parentheses = false
ij_java_align_multiline_parameters = false
ij_java_align_multiline_parameters_in_calls = false
ij_java_align_multiline_parenthesized_expression = false
ij_java_align_multiline_records = false
ij_java_align_multiline_resources = false
ij_java_align_multiline_ternary_operation = false
ij_java_align_multiline_text_blocks = false
ij_java_align_multiline_throws_list = false
ij_java_align_subsequent_simple_methods = false
ij_java_align_throws_keyword = false
ij_java_align_types_in_multi_catch = false
ij_java_annotation_parameter_wrap = off
ij_java_array_initializer_new_line_after_left_brace = false
ij_java_array_initializer_right_brace_on_new_line = false
ij_java_array_initializer_wrap = normal
ij_java_assert_statement_colon_on_next_line = false
ij_java_assert_statement_wrap = off
ij_java_assignment_wrap = off
ij_java_binary_operation_sign_on_next_line = false
ij_java_binary_operation_wrap = off
ij_java_blank_lines_after_anonymous_class_header = 0
ij_java_blank_lines_after_class_header = 0
ij_java_blank_lines_after_imports = 1
ij_java_blank_lines_after_package = 1
ij_java_blank_lines_around_class = 1
ij_java_blank_lines_around_field = 0
ij_java_blank_lines_around_field_in_interface = 0
ij_java_blank_lines_around_initializer = 0
ij_java_blank_lines_around_method = 0
ij_java_blank_lines_around_method_in_interface = 0
ij_java_blank_lines_before_class_end = 1
ij_java_blank_lines_before_imports = 1
ij_java_blank_lines_before_method_body = 0
ij_java_blank_lines_before_package = 1
ij_java_block_brace_style = next_line
ij_java_block_comment_add_space = false
ij_java_block_comment_at_first_column = true
ij_java_builder_methods = none
ij_java_call_parameters_new_line_after_left_paren = false
ij_java_call_parameters_right_paren_on_new_line = false
ij_java_call_parameters_wrap = normal
ij_java_case_statement_on_separate_line = true
ij_java_catch_on_new_line = true
ij_java_class_annotation_wrap = off
ij_java_class_brace_style = next_line
ij_java_class_count_to_use_import_on_demand = 5
ij_java_class_names_in_javadoc = 1
ij_java_deconstruction_list_wrap = normal
ij_java_do_not_indent_top_level_class_members = false
ij_java_do_not_wrap_after_single_annotation = false
ij_java_do_not_wrap_after_single_annotation_in_parameter = false
ij_java_do_while_brace_force = never
ij_java_doc_add_blank_line_after_description = true
ij_java_doc_add_blank_line_after_param_comments = false
ij_java_doc_add_blank_line_after_return = false
ij_java_doc_add_p_tag_on_empty_lines = false
ij_java_doc_align_exception_comments = false
ij_java_doc_align_param_comments = false
ij_java_doc_do_not_wrap_if_one_line = true
ij_java_doc_enable_formatting = true
ij_java_doc_enable_leading_asterisks = true
ij_java_doc_indent_on_continuation = false
ij_java_doc_keep_empty_lines = true
ij_java_doc_keep_empty_parameter_tag = true
ij_java_doc_keep_empty_return_tag = false
ij_java_doc_keep_empty_throws_tag = true
ij_java_doc_keep_invalid_tags = true
ij_java_doc_param_description_on_new_line = false
ij_java_doc_preserve_line_breaks = false
ij_java_doc_use_throws_not_exception_tag = true
ij_java_else_on_new_line = true
ij_java_enum_constants_wrap = off
ij_java_extends_keyword_wrap = normal
ij_java_extends_list_wrap = normal
ij_java_field_annotation_wrap = off
ij_java_finally_on_new_line = true
ij_java_for_brace_force = always
ij_java_for_statement_new_line_after_left_paren = false
ij_java_for_statement_right_paren_on_new_line = false
ij_java_for_statement_wrap = off
ij_java_generate_final_locals = false
ij_java_generate_final_parameters = false
ij_java_if_brace_force = never
ij_java_imports_layout = *,|,javax.**,java.**,|,$*
ij_java_indent_case_from_switch = true
ij_java_insert_inner_class_imports = false
ij_java_insert_override_annotation = true
ij_java_keep_blank_lines_before_right_brace = 10
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
ij_java_keep_blank_lines_in_code = 10
ij_java_keep_blank_lines_in_declarations = 10
ij_java_keep_builder_methods_indents = false
ij_java_keep_control_statement_in_one_line = true
ij_java_keep_first_column_comment = true
ij_java_keep_indents_on_empty_lines = true
ij_java_keep_line_breaks = true
ij_java_keep_multiple_expressions_in_one_line = true
ij_java_keep_simple_blocks_in_one_line = false
ij_java_keep_simple_classes_in_one_line = true
ij_java_keep_simple_lambdas_in_one_line = true
ij_java_keep_simple_methods_in_one_line = true
ij_java_label_indent_absolute = false
ij_java_label_indent_size = 0
ij_java_lambda_brace_style = end_of_line
ij_java_layout_static_imports_separately = true
ij_java_line_comment_add_space = false
ij_java_line_comment_add_space_on_reformat = false
ij_java_line_comment_at_first_column = false
ij_java_method_annotation_wrap = off
ij_java_method_brace_style = next_line
ij_java_method_call_chain_wrap = normal
ij_java_method_parameters_new_line_after_left_paren = true
ij_java_method_parameters_right_paren_on_new_line = false
ij_java_method_parameters_wrap = normal
ij_java_modifier_list_wrap = false
ij_java_multi_catch_types_wrap = normal
ij_java_names_count_to_use_import_on_demand = 3
ij_java_new_line_after_lparen_in_annotation = false
ij_java_new_line_after_lparen_in_deconstruction_pattern = true
ij_java_new_line_after_lparen_in_record_header = false
ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
ij_java_parameter_annotation_wrap = off
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
ij_java_place_assignment_sign_on_next_line = false
ij_java_prefer_longer_names = true
ij_java_prefer_parameters_wrap = false
ij_java_record_components_wrap = normal
ij_java_repeat_synchronized = true
ij_java_replace_instanceof_and_cast = false
ij_java_replace_null_check = false
ij_java_replace_sum_lambda_with_method_ref = false
ij_java_resource_list_new_line_after_left_paren = false
ij_java_resource_list_right_paren_on_new_line = false
ij_java_resource_list_wrap = on_every_item
ij_java_rparen_on_new_line_in_annotation = false
ij_java_rparen_on_new_line_in_deconstruction_pattern = true
ij_java_rparen_on_new_line_in_record_header = false
ij_java_space_after_closing_angle_bracket_in_type_argument = false
ij_java_space_after_colon = true
ij_java_space_after_comma = true
ij_java_space_after_comma_in_type_arguments = true
ij_java_space_after_for_semicolon = true
ij_java_space_after_quest = true
ij_java_space_after_type_cast = true
ij_java_space_before_annotation_array_initializer_left_brace = false
ij_java_space_before_annotation_parameter_list = false
ij_java_space_before_array_initializer_left_brace = false
ij_java_space_before_catch_keyword = true
ij_java_space_before_catch_left_brace = true
ij_java_space_before_catch_parentheses = true
ij_java_space_before_class_left_brace = true
ij_java_space_before_colon = true
ij_java_space_before_colon_in_foreach = true
ij_java_space_before_comma = false
ij_java_space_before_deconstruction_list = false
ij_java_space_before_do_left_brace = true
ij_java_space_before_else_keyword = true
ij_java_space_before_else_left_brace = true
ij_java_space_before_finally_keyword = true
ij_java_space_before_finally_left_brace = true
ij_java_space_before_for_left_brace = true
ij_java_space_before_for_parentheses = true
ij_java_space_before_for_semicolon = false
ij_java_space_before_if_left_brace = true
ij_java_space_before_if_parentheses = true
ij_java_space_before_method_call_parentheses = false
ij_java_space_before_method_left_brace = true
ij_java_space_before_method_parentheses = false
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
ij_java_space_before_quest = true
ij_java_space_before_switch_left_brace = true
ij_java_space_before_switch_parentheses = true
ij_java_space_before_synchronized_left_brace = false
ij_java_space_before_synchronized_parentheses = true
ij_java_space_before_try_left_brace = true
ij_java_space_before_try_parentheses = true
ij_java_space_before_type_parameter_list = false
ij_java_space_before_while_keyword = true
ij_java_space_before_while_left_brace = true
ij_java_space_before_while_parentheses = true
ij_java_space_inside_one_line_enum_braces = false
ij_java_space_within_empty_array_initializer_braces = true
ij_java_space_within_empty_method_call_parentheses = false
ij_java_space_within_empty_method_parentheses = false
ij_java_spaces_around_additive_operators = true
ij_java_spaces_around_annotation_eq = true
ij_java_spaces_around_assignment_operators = true
ij_java_spaces_around_bitwise_operators = true
ij_java_spaces_around_equality_operators = true
ij_java_spaces_around_lambda_arrow = true
ij_java_spaces_around_logical_operators = true
ij_java_spaces_around_method_ref_dbl_colon = false
ij_java_spaces_around_multiplicative_operators = true
ij_java_spaces_around_relational_operators = true
ij_java_spaces_around_shift_operators = true
ij_java_spaces_around_type_bounds_in_type_parameters = true
ij_java_spaces_around_unary_operator = false
ij_java_spaces_within_angle_brackets = false
ij_java_spaces_within_annotation_parentheses = false
ij_java_spaces_within_array_initializer_braces = false
ij_java_spaces_within_braces = true
ij_java_spaces_within_brackets = false
ij_java_spaces_within_cast_parentheses = false
ij_java_spaces_within_catch_parentheses = false
ij_java_spaces_within_deconstruction_list = false
ij_java_spaces_within_for_parentheses = false
ij_java_spaces_within_if_parentheses = false
ij_java_spaces_within_method_call_parentheses = false
ij_java_spaces_within_method_parentheses = false
ij_java_spaces_within_parentheses = false
ij_java_spaces_within_record_header = false
ij_java_spaces_within_switch_parentheses = false
ij_java_spaces_within_synchronized_parentheses = false
ij_java_spaces_within_try_parentheses = false
ij_java_spaces_within_while_parentheses = false
ij_java_special_else_if_treatment = true
ij_java_subclass_name_suffix = Impl
ij_java_ternary_operation_signs_on_next_line = false
ij_java_ternary_operation_wrap = on_every_item
ij_java_test_name_suffix = Test
ij_java_throws_keyword_wrap = normal
ij_java_throws_list_wrap = normal
ij_java_use_external_annotations = false
ij_java_use_fq_class_names = false
ij_java_use_relative_indents = false
ij_java_use_single_class_imports = true
ij_java_variable_annotation_wrap = off
ij_java_visibility = public
ij_java_while_brace_force = always
ij_java_while_on_new_line = true
ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = false
ij_java_wrap_long_lines = false
[*.nbtt]
indent_style = tab
max_line_length = 150
ij_continuation_indent_size = 4
ij_nbtt_keep_indents_on_empty_lines = false
ij_nbtt_space_after_colon = true
ij_nbtt_space_after_comma = true
ij_nbtt_space_before_colon = true
ij_nbtt_space_before_comma = false
ij_nbtt_spaces_within_brackets = false
ij_nbtt_spaces_within_parentheses = false
[*.properties]
ij_properties_align_group_field_declarations = false
ij_properties_keep_blank_lines = false
ij_properties_key_value_delimiter = equals
ij_properties_spaces_around_key_value_delimiter = false
[.editorconfig]
ij_editorconfig_align_group_field_declarations = false
ij_editorconfig_space_after_colon = false
ij_editorconfig_space_after_comma = true
ij_editorconfig_space_before_colon = false
ij_editorconfig_space_before_comma = false
ij_editorconfig_spaces_around_assignment_operators = true
[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.jspx,*.pom,*.rng,*.tagx,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
ij_xml_align_attributes = true
ij_xml_align_text = false
ij_xml_attribute_wrap = normal
ij_xml_block_comment_add_space = false
ij_xml_block_comment_at_first_column = true
ij_xml_keep_blank_lines = 2
ij_xml_keep_indents_on_empty_lines = false
ij_xml_keep_line_breaks = true
ij_xml_keep_line_breaks_in_text = true
ij_xml_keep_whitespaces = false
ij_xml_keep_whitespaces_around_cdata = preserve
ij_xml_keep_whitespaces_inside_cdata = false
ij_xml_line_comment_at_first_column = true
ij_xml_space_after_tag_name = false
ij_xml_space_around_equals_in_attribute = false
ij_xml_space_inside_empty_tag = false
ij_xml_text_wrap = normal
ij_xml_use_custom_settings = false
[{*.bash,*.sh,*.zsh}]
indent_size = 4
tab_width = 4
ij_shell_binary_ops_start_line = false
ij_shell_keep_column_alignment_padding = false
ij_shell_minify_program = false
ij_shell_redirect_followed_by_space = false
ij_shell_switch_cases_indented = false
ij_shell_use_unix_line_separator = true
[{*.comp,*.frag,*.fsh,*.geom,*.glsl,*.gsh,*.tesc,*.tese,*.vert,*.vsh}]
ij_glsl_space_after_colon = true
ij_glsl_space_after_comma = true
ij_glsl_space_after_for_semicolon = true
ij_glsl_space_after_quest = true
ij_glsl_space_before_colon = false
ij_glsl_space_before_comma = false
ij_glsl_space_before_for_semicolon = false
ij_glsl_space_before_quest = true
ij_glsl_spaces_around_additive_operators = true
ij_glsl_spaces_around_assignment_operators = true
ij_glsl_spaces_around_bitwise_operators = true
ij_glsl_spaces_around_equality_operators = true
ij_glsl_spaces_around_logical_operators = true
ij_glsl_spaces_around_multiplicative_operators = true
ij_glsl_spaces_around_relational_operators = true
ij_glsl_spaces_around_shift_operators = true
ij_glsl_spaces_within_brackets = false
ij_glsl_spaces_within_parentheses = false
[{*.gant,*.groovy,*.gy}]
ij_groovy_align_group_field_declarations = false
ij_groovy_align_multiline_array_initializer_expression = false
ij_groovy_align_multiline_assignment = false
ij_groovy_align_multiline_binary_operation = false
ij_groovy_align_multiline_chained_methods = false
ij_groovy_align_multiline_extends_list = false
ij_groovy_align_multiline_for = true
ij_groovy_align_multiline_list_or_map = true
ij_groovy_align_multiline_method_parentheses = false
ij_groovy_align_multiline_parameters = true
ij_groovy_align_multiline_parameters_in_calls = false
ij_groovy_align_multiline_resources = true
ij_groovy_align_multiline_ternary_operation = false
ij_groovy_align_multiline_throws_list = false
ij_groovy_align_named_args_in_map = true
ij_groovy_align_throws_keyword = false
ij_groovy_array_initializer_new_line_after_left_brace = false
ij_groovy_array_initializer_right_brace_on_new_line = false
ij_groovy_array_initializer_wrap = off
ij_groovy_assert_statement_wrap = off
ij_groovy_assignment_wrap = off
ij_groovy_binary_operation_wrap = off
ij_groovy_blank_lines_after_class_header = 0
ij_groovy_blank_lines_after_imports = 1
ij_groovy_blank_lines_after_package = 1
ij_groovy_blank_lines_around_class = 1
ij_groovy_blank_lines_around_field = 0
ij_groovy_blank_lines_around_field_in_interface = 0
ij_groovy_blank_lines_around_method = 1
ij_groovy_blank_lines_around_method_in_interface = 1
ij_groovy_blank_lines_before_imports = 1
ij_groovy_blank_lines_before_method_body = 0
ij_groovy_blank_lines_before_package = 0
ij_groovy_block_brace_style = end_of_line
ij_groovy_block_comment_add_space = false
ij_groovy_block_comment_at_first_column = true
ij_groovy_call_parameters_new_line_after_left_paren = false
ij_groovy_call_parameters_right_paren_on_new_line = false
ij_groovy_call_parameters_wrap = off
ij_groovy_catch_on_new_line = false
ij_groovy_class_annotation_wrap = split_into_lines
ij_groovy_class_brace_style = end_of_line
ij_groovy_class_count_to_use_import_on_demand = 5
ij_groovy_do_while_brace_force = never
ij_groovy_else_on_new_line = false
ij_groovy_enable_groovydoc_formatting = true
ij_groovy_enum_constants_wrap = off
ij_groovy_extends_keyword_wrap = off
ij_groovy_extends_list_wrap = off
ij_groovy_field_annotation_wrap = split_into_lines
ij_groovy_finally_on_new_line = false
ij_groovy_for_brace_force = never
ij_groovy_for_statement_new_line_after_left_paren = false
ij_groovy_for_statement_right_paren_on_new_line = false
ij_groovy_for_statement_wrap = off
ij_groovy_ginq_general_clause_wrap_policy = 2
ij_groovy_ginq_having_wrap_policy = 1
ij_groovy_ginq_indent_having_clause = true
ij_groovy_ginq_indent_on_clause = true
ij_groovy_ginq_on_wrap_policy = 1
ij_groovy_ginq_space_after_keyword = true
ij_groovy_if_brace_force = never
ij_groovy_import_annotation_wrap = 2
ij_groovy_imports_layout = *,|,javax.**,java.**,|,$*
ij_groovy_indent_case_from_switch = true
ij_groovy_indent_label_blocks = true
ij_groovy_insert_inner_class_imports = false
ij_groovy_keep_blank_lines_before_right_brace = 2
ij_groovy_keep_blank_lines_in_code = 2
ij_groovy_keep_blank_lines_in_declarations = 2
ij_groovy_keep_control_statement_in_one_line = true
ij_groovy_keep_first_column_comment = true
ij_groovy_keep_indents_on_empty_lines = false
ij_groovy_keep_line_breaks = true
ij_groovy_keep_multiple_expressions_in_one_line = false
ij_groovy_keep_simple_blocks_in_one_line = false
ij_groovy_keep_simple_classes_in_one_line = true
ij_groovy_keep_simple_lambdas_in_one_line = true
ij_groovy_keep_simple_methods_in_one_line = true
ij_groovy_label_indent_absolute = false
ij_groovy_label_indent_size = 0
ij_groovy_lambda_brace_style = end_of_line
ij_groovy_layout_static_imports_separately = true
ij_groovy_line_comment_add_space = false
ij_groovy_line_comment_add_space_on_reformat = false
ij_groovy_line_comment_at_first_column = true
ij_groovy_method_annotation_wrap = split_into_lines
ij_groovy_method_brace_style = end_of_line
ij_groovy_method_call_chain_wrap = off
ij_groovy_method_parameters_new_line_after_left_paren = false
ij_groovy_method_parameters_right_paren_on_new_line = false
ij_groovy_method_parameters_wrap = off
ij_groovy_modifier_list_wrap = false
ij_groovy_names_count_to_use_import_on_demand = 3
ij_groovy_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
ij_groovy_parameter_annotation_wrap = off
ij_groovy_parentheses_expression_new_line_after_left_paren = false
ij_groovy_parentheses_expression_right_paren_on_new_line = false
ij_groovy_prefer_parameters_wrap = false
ij_groovy_resource_list_new_line_after_left_paren = false
ij_groovy_resource_list_right_paren_on_new_line = false
ij_groovy_resource_list_wrap = off
ij_groovy_space_after_assert_separator = true
ij_groovy_space_after_colon = true
ij_groovy_space_after_comma = true
ij_groovy_space_after_comma_in_type_arguments = true
ij_groovy_space_after_for_semicolon = true
ij_groovy_space_after_quest = true
ij_groovy_space_after_type_cast = true
ij_groovy_space_before_annotation_parameter_list = false
ij_groovy_space_before_array_initializer_left_brace = false
ij_groovy_space_before_assert_separator = false
ij_groovy_space_before_catch_keyword = true
ij_groovy_space_before_catch_left_brace = true
ij_groovy_space_before_catch_parentheses = true
ij_groovy_space_before_class_left_brace = true
ij_groovy_space_before_closure_left_brace = true
ij_groovy_space_before_colon = true
ij_groovy_space_before_comma = false
ij_groovy_space_before_do_left_brace = true
ij_groovy_space_before_else_keyword = true
ij_groovy_space_before_else_left_brace = true
ij_groovy_space_before_finally_keyword = true
ij_groovy_space_before_finally_left_brace = true
ij_groovy_space_before_for_left_brace = true
ij_groovy_space_before_for_parentheses = true
ij_groovy_space_before_for_semicolon = false
ij_groovy_space_before_if_left_brace = true
ij_groovy_space_before_if_parentheses = true
ij_groovy_space_before_method_call_parentheses = false
ij_groovy_space_before_method_left_brace = true
ij_groovy_space_before_method_parentheses = false
ij_groovy_space_before_quest = true
ij_groovy_space_before_record_parentheses = false
ij_groovy_space_before_switch_left_brace = true
ij_groovy_space_before_switch_parentheses = true
ij_groovy_space_before_synchronized_left_brace = true
ij_groovy_space_before_synchronized_parentheses = true
ij_groovy_space_before_try_left_brace = true
ij_groovy_space_before_try_parentheses = true
ij_groovy_space_before_while_keyword = true
ij_groovy_space_before_while_left_brace = true
ij_groovy_space_before_while_parentheses = true
ij_groovy_space_in_named_argument = true
ij_groovy_space_in_named_argument_before_colon = false
ij_groovy_space_within_empty_array_initializer_braces = false
ij_groovy_space_within_empty_method_call_parentheses = false
ij_groovy_spaces_around_additive_operators = true
ij_groovy_spaces_around_assignment_operators = true
ij_groovy_spaces_around_bitwise_operators = true
ij_groovy_spaces_around_equality_operators = true
ij_groovy_spaces_around_lambda_arrow = true
ij_groovy_spaces_around_logical_operators = true
ij_groovy_spaces_around_multiplicative_operators = true
ij_groovy_spaces_around_regex_operators = true
ij_groovy_spaces_around_relational_operators = true
ij_groovy_spaces_around_shift_operators = true
ij_groovy_spaces_within_annotation_parentheses = false
ij_groovy_spaces_within_array_initializer_braces = false
ij_groovy_spaces_within_braces = true
ij_groovy_spaces_within_brackets = false
ij_groovy_spaces_within_cast_parentheses = false
ij_groovy_spaces_within_catch_parentheses = false
ij_groovy_spaces_within_for_parentheses = false
ij_groovy_spaces_within_gstring_injection_braces = false
ij_groovy_spaces_within_if_parentheses = false
ij_groovy_spaces_within_list_or_map = false
ij_groovy_spaces_within_method_call_parentheses = false
ij_groovy_spaces_within_method_parentheses = false
ij_groovy_spaces_within_parentheses = false
ij_groovy_spaces_within_switch_parentheses = false
ij_groovy_spaces_within_synchronized_parentheses = false
ij_groovy_spaces_within_try_parentheses = false
ij_groovy_spaces_within_tuple_expression = false
ij_groovy_spaces_within_while_parentheses = false
ij_groovy_special_else_if_treatment = true
ij_groovy_ternary_operation_wrap = off
ij_groovy_throws_keyword_wrap = off
ij_groovy_throws_list_wrap = off
ij_groovy_use_flying_geese_braces = false
ij_groovy_use_fq_class_names = false
ij_groovy_use_fq_class_names_in_javadoc = true
ij_groovy_use_relative_indents = false
ij_groovy_use_single_class_imports = true
ij_groovy_variable_annotation_wrap = off
ij_groovy_while_brace_force = never
ij_groovy_while_on_new_line = false
ij_groovy_wrap_chain_calls_after_dot = false
ij_groovy_wrap_long_lines = false
[{*.har,*.json,*.png.mcmeta,mcmod.info,pack.mcmeta}]
indent_size = 4
ij_json_array_wrapping = split_into_lines
ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false
ij_json_keep_line_breaks = true
ij_json_keep_trailing_comma = false
ij_json_object_wrapping = split_into_lines
ij_json_property_alignment = do_not_align
ij_json_space_after_colon = true
ij_json_space_after_comma = true
ij_json_space_before_colon = false
ij_json_space_before_comma = false
ij_json_spaces_within_braces = false
ij_json_spaces_within_brackets = false
ij_json_wrap_long_lines = false
[{*.htm,*.html,*.sht,*.shtm,*.shtml}]
ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
ij_html_align_attributes = true
ij_html_align_text = false
ij_html_attribute_wrap = normal
ij_html_block_comment_add_space = false
ij_html_block_comment_at_first_column = true
ij_html_do_not_align_children_of_min_lines = 0
ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p
ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot
ij_html_enforce_quotes = false
ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var
ij_html_keep_blank_lines = 2
ij_html_keep_indents_on_empty_lines = false
ij_html_keep_line_breaks = true
ij_html_keep_line_breaks_in_text = true
ij_html_keep_whitespaces = false
ij_html_keep_whitespaces_inside = span,pre,textarea
ij_html_line_comment_at_first_column = true
ij_html_new_line_after_last_attribute = never
ij_html_new_line_before_first_attribute = never
ij_html_quote_style = double
ij_html_remove_new_line_before_tags = br
ij_html_space_after_tag_name = false
ij_html_space_around_equality_in_attribute = false
ij_html_space_inside_empty_tag = false
ij_html_text_wrap = normal
[{*.kt,*.kts}]
ij_kotlin_align_in_columns_case_branch = false
ij_kotlin_align_multiline_binary_operation = false
ij_kotlin_align_multiline_extends_list = false
ij_kotlin_align_multiline_method_parentheses = false
ij_kotlin_align_multiline_parameters = true
ij_kotlin_align_multiline_parameters_in_calls = false
ij_kotlin_allow_trailing_comma = false
ij_kotlin_allow_trailing_comma_on_call_site = false
ij_kotlin_assignment_wrap = off
ij_kotlin_blank_lines_after_class_header = 0
ij_kotlin_blank_lines_around_block_when_branches = 0
ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1
ij_kotlin_block_comment_add_space = false
ij_kotlin_block_comment_at_first_column = true
ij_kotlin_call_parameters_new_line_after_left_paren = false
ij_kotlin_call_parameters_right_paren_on_new_line = false
ij_kotlin_call_parameters_wrap = off
ij_kotlin_catch_on_new_line = false
ij_kotlin_class_annotation_wrap = split_into_lines
ij_kotlin_continuation_indent_for_chained_calls = true
ij_kotlin_continuation_indent_for_expression_bodies = true
ij_kotlin_continuation_indent_in_argument_lists = true
ij_kotlin_continuation_indent_in_elvis = true
ij_kotlin_continuation_indent_in_if_conditions = true
ij_kotlin_continuation_indent_in_parameter_lists = true
ij_kotlin_continuation_indent_in_supertype_lists = true
ij_kotlin_else_on_new_line = false
ij_kotlin_enum_constants_wrap = off
ij_kotlin_extends_list_wrap = off
ij_kotlin_field_annotation_wrap = split_into_lines
ij_kotlin_finally_on_new_line = false
ij_kotlin_if_rparen_on_new_line = false
ij_kotlin_import_nested_classes = false
ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^
ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
ij_kotlin_keep_blank_lines_before_right_brace = 2
ij_kotlin_keep_blank_lines_in_code = 2
ij_kotlin_keep_blank_lines_in_declarations = 2
ij_kotlin_keep_first_column_comment = true
ij_kotlin_keep_indents_on_empty_lines = false
ij_kotlin_keep_line_breaks = true
ij_kotlin_lbrace_on_next_line = false
ij_kotlin_line_break_after_multiline_when_entry = true
ij_kotlin_line_comment_add_space = false
ij_kotlin_line_comment_add_space_on_reformat = false
ij_kotlin_line_comment_at_first_column = true
ij_kotlin_method_annotation_wrap = split_into_lines
ij_kotlin_method_call_chain_wrap = off
ij_kotlin_method_parameters_new_line_after_left_paren = false
ij_kotlin_method_parameters_right_paren_on_new_line = false
ij_kotlin_method_parameters_wrap = off
ij_kotlin_name_count_to_use_star_import = 5
ij_kotlin_name_count_to_use_star_import_for_members = 3
ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.**,io.ktor.**
ij_kotlin_parameter_annotation_wrap = off
ij_kotlin_space_after_comma = true
ij_kotlin_space_after_extend_colon = true
ij_kotlin_space_after_type_colon = true
ij_kotlin_space_before_catch_parentheses = true
ij_kotlin_space_before_comma = false
ij_kotlin_space_before_extend_colon = true
ij_kotlin_space_before_for_parentheses = true
ij_kotlin_space_before_if_parentheses = true
ij_kotlin_space_before_lambda_arrow = true
ij_kotlin_space_before_type_colon = false
ij_kotlin_space_before_when_parentheses = true
ij_kotlin_space_before_while_parentheses = true
ij_kotlin_spaces_around_additive_operators = true
ij_kotlin_spaces_around_assignment_operators = true
ij_kotlin_spaces_around_equality_operators = true
ij_kotlin_spaces_around_function_type_arrow = true
ij_kotlin_spaces_around_logical_operators = true
ij_kotlin_spaces_around_multiplicative_operators = true
ij_kotlin_spaces_around_range = false
ij_kotlin_spaces_around_relational_operators = true
ij_kotlin_spaces_around_unary_operator = false
ij_kotlin_spaces_around_when_arrow = true
ij_kotlin_variable_annotation_wrap = off
ij_kotlin_while_on_new_line = false
ij_kotlin_wrap_elvis_expressions = 1
ij_kotlin_wrap_expression_body_functions = 0
ij_kotlin_wrap_first_method_in_call_chain = false
[{*.markdown,*.md}]
ij_markdown_force_one_space_after_blockquote_symbol = true
ij_markdown_force_one_space_after_header_symbol = true
ij_markdown_force_one_space_after_list_bullet = true
ij_markdown_force_one_space_between_words = true
ij_markdown_format_tables = true
ij_markdown_insert_quote_arrows_on_wrap = true
ij_markdown_keep_indents_on_empty_lines = false
ij_markdown_keep_line_breaks_inside_text_blocks = true
ij_markdown_max_lines_around_block_elements = 1
ij_markdown_max_lines_around_header = 1
ij_markdown_max_lines_between_paragraphs = 1
ij_markdown_min_lines_around_block_elements = 1
ij_markdown_min_lines_around_header = 1
ij_markdown_min_lines_between_paragraphs = 1
ij_markdown_wrap_text_if_long = true
ij_markdown_wrap_text_inside_blockquotes = true
[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}]
ij_toml_keep_indents_on_empty_lines = false
[{*.yaml,*.yml}]
indent_size = 2
ij_yaml_align_values_properties = do_not_align
ij_yaml_autoinsert_sequence_marker = true
ij_yaml_block_mapping_on_new_line = false
ij_yaml_indent_sequence_value = true
ij_yaml_keep_indents_on_empty_lines = false
ij_yaml_keep_line_breaks = true
ij_yaml_sequence_on_new_line = false
ij_yaml_space_before_colon = false
ij_yaml_spaces_within_braces = true
ij_yaml_spaces_within_brackets = true
+41 -20
View File
@@ -1,26 +1,47 @@
# eclipse
bin
*.launch
.settings
.metadata
build/
*.ipr
run/
*.iws
out/
*.iml
.gradle/
.gradle-cache/
output/
bin/
libs/
.architectury-transformer/
.classpath
.project
.idea/
classes/
.metadata
.vscode
.settings
*.launch
hs_err_pid*
# idea
out
*.ipr
*.iws
*.iml
.idea
**/src/generated/
Merged/
# Folder created by the buildAll scripts
buildAllJars/
# gradle
build
.gradle
relocate_natives/.venv/
relocate_natives/__pycache__/
relocate_natives/apple-codesign/
relocate_natives/cache/
# other
eclipse
run
# file from notepad++
*.bak
# Files from Forge MDK
logs
forge*changelog.txt
# file genearated via MC version switching using preprocessor
build.properties
# Sqlite databases
*.sqlite
*.sqlite-journal
*.sqlite-shm
*.sqlite-wal
# Don't add access transformers to git as they're dynamically generated
accesstransformer.cfg
+100
View File
@@ -0,0 +1,100 @@
# use Eclipse's JDK
# The ci should always use a unix(-like) OS to work
image: eclipse-temurin:21
# all stages need to be defined here
# TODO: Make stages depend on what is in versionProperties
stages:
- build
- api
- pages
variables:
# Pull core when building
GIT_SUBMODULE_STRATEGY: recursive
# These can be extended so code is a bit less duplicated
.build_java:
#image: eclipse-temurin:17
before_script:
- apt-get update
- apt-get install python3 python3-pip python-is-python3 python3-venv -y --no-install-recommends
cache:
key: "gradleCache_$CI_JOB_NAME_SLUG"
policy: pull-push
paths:
- .gradle
- cache/
allow_failure: true
retry:
max: 2
when:
- runner_system_failure
- stuck_or_timeout_failure
build:
stage: build
parallel:
matrix:
- MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1", "1.20.2", "1.20.4", "1.20.6", "1.21.1", "1.21.3", "1.21.4"]
script:
# this both runs the unit tests and assembles the code
- ./gradlew clean -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
- ./gradlew build -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
- ./gradlew mergeJars -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
- cp ./fabric/build/libs/* ./forge/build/libs/* ./neoforge/build/libs/* ./Merged/* . || true
artifacts:
name: "NightlyBuild_${MC_VER}-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
paths:
- ./*.jar
exclude:
- ./*-all.jar
- ./*-dev.jar
- ./*-sources.jar
expire_in: 14 days
when: always
extends: .build_java
api:
stage: api
needs: []
script:
# this should only run for the API
- ./gradlew api:clean --gradle-user-home cache/;
# this also runs unit tests
- ./gradlew api:build --gradle-user-home cache/;
- ./gradlew api:addSourcesToCompiledJar --gradle-user-home cache/;
- cp ./coreSubProjects/api/build/libs/merged/* .
artifacts:
name: "NightlyBuild_Api-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
paths:
- ./*.jar
exclude:
- ./*-all.jar
- ./*-dev.jar
- ./*-sources.jar
expire_in: 1 day
when: always
extends: .build_java
# generate and publish API javadocs
pages:
stage: pages
needs: []
script:
# this should only run for the API
- ./gradlew api:clean --gradle-user-home cache/;
# this also runs unit tests
- ./gradlew api:build --gradle-user-home cache/;
- ./gradlew api:javadoc --gradle-user-home cache/;
- mkdir public
- cp -r $CI_PROJECT_DIR/coreSubProjects/api/build/docs/javadoc/. public
artifacts:
paths:
- public
allow_failure: false
extends: .build_java
+37
View File
@@ -0,0 +1,37 @@
## Check off each item in this list before submitting:
<!--
To mark a section as complete either put an "x" in between the square brackets, example: "[x]"
Or click the checkbox once the issue has been created.
-->
1. [ ] Check the FAQ to see if your issue has already been reported and has a solution:
[Problems-and-solutions](https://gitlab.com/distant-horizons-team/distant-horizons/-/wikis/1-user-guide/1-frequently-asked-questions/2-problems-and-solutions/Problems-and-Solutions)
2. [ ] Make sure you are not using any mods on the incompatible list:
[Mod support FAQ](https://gitlab.com/distant-horizons-team/distant-horizons/-/wikis/1-user-guide/1-frequently-asked-questions/4-mod-support/Mod-Support)
3. [ ] Check the existing issues to verify that your bug hasn't already been submitted:
[Issues](https://gitlab.com/distant-horizons-team/distant-horizons/-/issues)
4. [ ] Upload Minecraft's crash report and/or log. \
Minecraft crash reports are located in: `.minecraft/crash-reports` \
Minecraft logs are located in: `.minecraft/logs`
5. [ ] Upload your Distant Horizons Config. \
The config is found in: `.minecraft/configs/DistantHorizons.toml`
6. [ ] Fill out the information below:
* **minecraft version**:
* **Distant Horizons version**:
* **Mod loader**:
* **Installed mods (list the smallest number of mods that you can use to re-create the bug)**:
* **Describe the bug**:
* **Steps to reproduce the bug**:
+3
View File
@@ -0,0 +1,3 @@
Before creating an issue, please select the appropriate template from the dropdown above.
The template will walk you through submitting a bug, feature, or improvement request.
@@ -0,0 +1,5 @@
- [ ] Check the existing [feature requests](https://gitlab.com/distant-horizons-team/distant-horizons/-/issues?sort=updated_desc&state=opened&label_name%5B%5D=Feature) to verify that your feature hasn't already been suggested.
1. **Describe the feature**:
2. **Describe why this feature should be added**:
@@ -0,0 +1,3 @@
1. Check the existing [improvement requests](https://gitlab.com/distant-horizons-team/distant-horizons/-/issues?sort=updated_desc&state=all&label_name%5B%5D=Improvement) to verify that your improvement hasn't already been suggested.
2. **Describe the improvement**:
+3
View File
@@ -0,0 +1,3 @@
[submodule "coreSubProjects"]
path = coreSubProjects
url = https://gitlab.com/jeseibel/distant-horizons-core.git
+7
View File
@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Fabric Client &amp; Server" type="CompoundRunConfigurationType">
<toRun name="Fabric Client (:fabric)" type="Application" />
<toRun name="Fabric Server (:fabric)" type="Application" />
<method v="2" />
</configuration>
</component>
+7
View File
@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Forge Client &amp; Server" type="CompoundRunConfigurationType">
<toRun name="Forge Client (gradle)" type="GradleRunConfiguration" />
<toRun name="Forge Server (gradle)" type="GradleRunConfiguration" />
<method v="2" />
</configuration>
</component>
+24
View File
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Forge Client (gradle)" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="forge:runClient" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+24
View File
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Forge Server (gradle)" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="forge:runServer" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+7
View File
@@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Neoforge Client &amp; Server" type="CompoundRunConfigurationType">
<toRun name="Neoforge Client (gradle)" type="GradleRunConfiguration" />
<toRun name="Neoforge Server (gradle)" type="GradleRunConfiguration" />
<method v="2" />
</configuration>
</component>
+24
View File
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Neoforge Client (gradle)" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="neoforge:runClient" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+24
View File
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Neoforge Server (gradle)" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="neoforge:runServer" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+24
View File
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="distant-horizons [build]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="build" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+24
View File
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="distant-horizons [clean]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="clean" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="distant-horizons [core:build]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="core:build" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="distant-horizons [fabric:runClient]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="fabric:runClient" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="distant-horizons [forge:runClient]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="forge:runClient" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+24
View File
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="distant-horizons [mergeJars]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="mergeJars" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="distant-horizons [neoforge:runClient]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="neoforge:runClient" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+24
View File
@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="distant-horizons [test]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="test" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>
+12
View File
@@ -0,0 +1,12 @@
FROM eclipse-temurin:17-jdk
WORKDIR /home/build/
COPY ./gradlew .
RUN chmod +x ./gradlew
CMD echo "\r========== [CLEAN: $MC_VER] ==========" && \
./gradlew clean -PmcVer="$MC_VER" --gradle-user-home .gradle-cache/ && \
echo "\r========== [BUILD: $MC_VER] ==========" && \
./gradlew build -PmcVer="$MC_VER" --gradle-user-home .gradle-cache/ && \
echo "\r========== [MERGE: $MC_VER] ==========" && \
./gradlew mergeJars -PmcVer="$MC_VER" --gradle-user-home .gradle-cache/ && \
echo "\r========== [DONE: $MC_VER] =========="
+1
View File
@@ -0,0 +1 @@
Distant Horizons logos © 2024 by Pankakes are licensed under CC BY-SA 4.0
+165
View File
@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
+210
View File
@@ -0,0 +1,210 @@
# <img src="https://gitlab.com/distant-horizons-team/distant-horizons-core/-/raw/main/_Misc%20Files/logo%20files/new/SVG/Distant-Horizons.svg" height="128px">
_See farther without turning your game into a slide show._
<br>
# What is Distant Horizons?
Distant Horizons is a mod which implements a [Level of Detail](https://en.wikipedia.org/wiki/Level_of_detail_(computer_graphics)) system to Minecraft.\
This allows for far greater render distances without harming performance by gradually lowering the quality of distant terrain.
Below is a video demonstrating the system:
<a href="https://youtu.be/SxQdbtjGEsc" target="_blank">![Distant Horizons - Alpha 2.0](https://i.ytimg.com/vi/SxQdbtjGEsc/hqdefault.jpg)</a>
<br>
## Minecraft and Library Versions
### This branch supports the following versions of Minecraft:
#### 1.20.4, 1.20.3 (Default)
Fabric: 0.15.1\
Fabric API: 0.91.2+1.20.4\
Forge: 49.0.30\
NeoForge: 118-beta\
Parchment: 1.20.2:2023.12.10\
Modmenu: 9.0.0-pre.1
#### 1.20.2
Fabric: 0.14.24\
Fabric API: 0.90.4+1.20.2\
Forge: 48.0.13\
Parchment: 1.20.1:2023.09.03\
Modmenu: 8.0.0
#### 1.20.1, 1.20
Fabric: 0.14.24\
Fabric API: 0.90.4+1.20.1\
Forge: 47.2.1\
Parchment: 1.20.1:2023.09.03\
Modmenu: 7.2.2
#### 1.19.4
Fabric: 0.14.24\
Fabric API: 0.87.1+1.19.4\
Forge: 45.2.4\
Parchment: 1.19.4:2023.06.26\
Modmenu: 6.3.1
#### 1.19.2
Fabric: 0.14.24\
Fabric API: 0.76.1+1.19.2\
Forge: 43.3.2\
Parchment: 1.19.2:2022.11.27\
Modmenu: 4.2.0-beta.2
#### 1.18.2
Fabric: 0.14.24\
Fabric API: 0.76.0+1.18.2\
Forge: 40.2.10\
Parchment: 1.18.2:2022.11.06\
Modmenu: 3.2.5
#### 1.17.1, 1.17
Fabric: 0.14.24\
Fabric API: 0.46.1+1.17\
Forge: 37.1.1\
Parchment: 1.17.1:2021.12.12\
Modmenu: 2.0.14
#### 1.16.5, 1.16.4
Fabric: 0.14.24\
Fabric API: 0.42.0+1.16\
Forge: 36.2.39\
Parchment: 1.16.5:2022.03.06\
Modmenu: 1.16.22
### Versions no longer supported
- 1.18.1, 1.18
- 1.19.1, 1.19
- 1.19.3
<br>
### Plugin and Library versions
Gradle: 8.5\
Fabric loom: 1.4-SNAPSHOT\
Architectury loom (Forge gradle replacement): 1.4-SNAPSHOT\
Sponge vanilla gradle: 0.2.1-SNAPSHOT\
Java Preprocessor plugin: Manifold Preprocessor
<br>
## Source Code Installation
### Prerequisites
* A Java Development Kit (JDK) for Java 17 (recommended) or newer. <br>
Visit https://www.oracle.com/java/technologies/downloads/ for installers.
* Git or someway to clone git projects. <br>
Visit https://git-scm.com/ for installers.
* (Not required) Any Java IDE with plugins that support Manifold, for example IntelliJ IDEA.
**If using IntelliJ:**
1. Install the Manifold plugin
2. Open IDEA and import the build.gradle
3. Refresh the Gradle project in IDEA if required
**If using Eclipse: (Note that Eclipse doesn't support Manifold's preprocessor!)**
1. Run the command: `./gradlew geneclipseruns`
2. Run the command: `./gradlew eclipse`
3. Make sure eclipse has the JDK 17 installed. (This is needed so that eclipse can run minecraft)
4. Import the project into eclipse
<br>
## Switching Versions
To switch between different Minecraft versions, change `mcVer=1.?` in the `gradle.properties` file.
If running in an IDE, to ensure the IDE noticed the version change, run any gradle command to refresh gradle.\
In IntelliJ, you will also need to do a gradle sync if it didn't happen automatically.
<br>
## Compiling
Prerequisites:
- JDK 17 or newer
From the File Explorer:
1. Download and extract the project zip
2. Download the core from https://gitlab.com/distant-horizons-team/distant-horizons-core and extract into a folder called `coreSubProjects`
3. Open a terminal emulator in the project folder (On Windows you can type `cmd` in the title bar)
4. Run the commands: `./gradlew assemble` (You may need to use a `.\` on Windows)
5. Merge the jars with `./gradlew mergeJars`
6. The compiled jar file will be in the folder `Merged`
From the command line:
1. `git clone --recurse-submodules https://gitlab.com/distant-horizons-team/distant-horizons.git`
2. `cd distant-horizons`
3. `./gradlew assemble`
4. `./gradlew mergeJars`
5. The compiled jar file will be in the folder `Merged`
Run tests with: `./gradlew test`
>Note: You can add the argument `-PmcVer=?` to tell gradle to build a selected MC version instead of having to modify the `gradle.properties` file.\
> For example: `./gradlew assemble -PmcVer=1.18.2`
<br>
## Compiling with Docker
`./compile <version>`
You can also locally compile the DH jars without a Java environment by using Docker. Where `<version>` is the version of Minecraft to compile for (ie `1.20.1`), or the keyword `all`. See [Versions](#minecraft-and-library-versions) for a list of all supported values.
<br>
## Other commands
`./gradlew --refresh-dependencies` to refresh local dependencies.
`./gradlew clean` to delete any compiled code.
<br>
## Note to self
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 & [Parchment](https://parchmentmc.org/) mappings.
To generate the source code run `./gradlew genSources` <br>
If your IDE fails to auto-detect the source jars when browsing Minecraft classes; manually select the JAR file ending with -sources.jar when prompted by your IDE. <br>
(In IntelliJ it's at the top where it says "choose sources" when browsing a Minecraft class)
<br>
## Other Useful commands
Run the standalone jar: `./gradlew run` <br>
Build the standalone jar: `./gradlew core:build` <br>
Only build Fabric: `./gradlew fabric:assemble` or `./gradlew fabric:build` <br>
Only build Forge: `./gradlew forge:assemble` or `./gradlew forge:build` <br>
Run the Fabric client (for debugging): `./gradlew fabric:runClient` <br>
Run the Forge client (for debugging): `./gradlew forge:runClient` <br>
To build all versions: `./buildAll` (all builds will end up in the `Merged` folder)
<br>
## Open Source Acknowledgements
Forgix (To merge multiple mod versions into one jar) [_Formerly_ [_DHJarMerger_](https://github.com/Ran-helo/DHJarMerger)]\
https://github.com/PacifistMC/Forgix
LZ4 for Java (data compression)\
https://github.com/lz4/lz4-java
NightConfig for JSON & TOML (config handling)\
https://github.com/TheElectronWill/night-config
SVG Salamander for SVG support (not being used atm)\
https://github.com/blackears/svgSalamander
sqlite-jdbc\
https://github.com/xerial/sqlite-jdbc
-70
View File
@@ -1,70 +0,0 @@
This mod adds a Level Of Detail (LOD) system to Minecraft.
This implementation renders simplified chunks outside the normal render distance
allowing for an increased view distance without harming performance.
Or in other words: this mod let's you see farther without turning your game into a slide show.
If you want to see a quick demo, check out the video I made here:
https://youtu.be/CCT-3s02tYA
Forge version: 1.16.5-36.1.0
Notes:
This version has been confirmed to work in Eclipse and Retail Minecraft.
(Retail running forge version 1.16.5-36.1.0)
========================
source code installation
========================
See the Forge Documentation online for more detailed instructions:
http://mcforge.readthedocs.io/en/latest/gettingstarted/
Step 1: Create a system variable called "JAVA_MC_HOME" with the location of the JDK 1.8.0_251 (This is needed for gradle to work correctly)
Step 2: replace JAVA_HOME with JAVA_MC_HOME in gradle.bat
Step 3: open a command line in the project folder
Step 4: run the command: "./gradlew geneclipseruns"
Step 5: run the command: "./gradlew eclipse"
Step 6: Make sure the eclipse has the JDK 1.8.0_251 installed. (This is needed so that eclipse can run minecraft)
Step 7: Import the project into eclipse
=========
compiling
=========
Step 1: open a command line in the project folder
Step 2: run the command: "./gradlew build"
Step 3: the compiled jar file will be in the folder "build\libs"
==============
Other commands
==============
"./gradlew --refresh-dependencies" to refresh local dependencies.
"./gradlew clean" to reset everything (this does not affect your code) and then start the process again.
============
Note to self
============
The Minecraft source code is NOT added to your workspace in a editable way. Minecraft is treated like a normal Library. Sources are there for documentation and research purposes only.
Source code uses mcp mappings not Mojangs.
The source code can be 'created' with the ./eclipse command and can be found in the following path:
minecraft-lod-mod\build\fg_cache\mcp\ VERSION \joined\ RANDOM_STRING \patch\output.jar
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

File diff suppressed because one or more lines are too long
+725 -158
View File
@@ -1,194 +1,761 @@
buildscript {
repositories {
maven { url = 'https://files.minecraftforge.net/maven' }
jcenter()
mavenCentral()
maven { url = 'https://repo.spongepowered.org/maven/' }
// potential replacement in case of problems:
// https://dist.creeper.host/Sponge/maven
}
dependencies {
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
classpath group: 'org.spongepowered', name: 'mixingradle', version: '0.7-SNAPSHOT'
}
import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer
import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
import org.apache.tools.zip.ZipEntry
import javax.annotation.Nonnull
import org.apache.tools.zip.ZipOutputStream
plugins {
id "java"
// Plugin to put dependencies inside our final jar
id "com.github.johnrengelman.shadow" version '8.1.1' apply false
// Plugin to create merged jars
id "io.github.pacifistmc.forgix" version "1.2.9"
// Manifold preprocessor
id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha"
// Architectury is used here only as a replacement for forge's own loom
id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false
}
apply plugin: 'net.minecraftforge.gradle'
apply plugin: 'org.spongepowered.mixin'
// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
version = 'a1.3.2'
group = 'com.backsun.lod'
archivesBaseName = 'lod_1.16.5'
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
/**
* Creates the list of preprocessors to use.
*
* @param mcVers array of all MC versions
* @param mcIndex array index of the currently active MC version
*/
def writeBuildGradlePredefine(List<String> mcVers, int mcIndex)
{
// Build the list of preprocessors to use
StringBuilder sb = new StringBuilder();
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
minecraft {
// The mappings can be changed at any time, and must be in the following format.
// snapshot_YYYYMMDD Snapshot are built nightly.
// stable_# Stables are built at the discretion of the MCP team.
// Use non-default mappings at your own risk. they may not always work.
// Simply re-run your setup task after changing the mappings to update your workspace.
mappings channel: 'official', version: '1.16.5'
// makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n");
for (int i = 0; i < mcVers.size(); i++)
{
String verStr = mcVers[i].replace(".", "_");
sb.append("MC_" + verStr + "=" + i.toString() + "\n");
if (mcIndex == i)
sb.append("MC_VER=" + i.toString() + "\n");
}
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
// Default run configurations.
// These can be tweaked, removed, or duplicated as needed.
runs {
client {
workingDirectory project.file('run')
arg "-mixin.config=lod.mixins.json"
// Check if this is a development build
if (mod_version.toLowerCase().contains("dev"))
{
// WARNING: only use this for logging, we don't want to have confusion
// when a method doesn't work correctly in the release build.
sb.append("DEV_BUILD=\n");
}
// Recommended logging data for a userdev environment
// The markers can be changed as needed.
// "SCAN": For mods scan.
// "REGISTRIES": For firing of registry events.
// "REGISTRYDUMP": For getting the contents of all registries.
property 'forge.logging.markers', 'REGISTRIES'
new File(projectDir, "build.properties").text = sb.toString()
}
// Recommended logging level for the console
// You can set various levels here.
// Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
property 'forge.logging.console.level', 'debug'
mods {
examplemod {
source sourceSets.main
}
}
// Transfers the values set in settings.gradle to the rest of the project
project.gradle.ext.getProperties().each { prop ->
rootProject.ext.set(prop.key, prop.value)
//println "Added prop [key:" + prop.key + ", value:" + prop.value + "]"
}
// Sets up manifold stuff
writeBuildGradlePredefine(rootProject.mcVers, rootProject.mcIndex)
// Sets up the version string (the name we use for our jar)
rootProject.versionStr = rootProject.mod_version + "-" + rootProject.minecraft_version // + "-" + new Date().format("yyyy_MM_dd_HH_mm")
// Forgix settings (used for merging jars)
forgix {
String loaderHyphenSeparatedList = ((String)gradle.builds_for).replaceAll(",", "-");
group = "com.seibel.distanthorizons"
mergedJarName = "DistantHorizons-${loaderHyphenSeparatedList}-${rootProject.versionStr}.jar"
if (findProject(":forge"))
forge {
jarLocation = "build/libs/DistantHorizons-forge-${rootProject.versionStr}.jar"
}
if (findProject(":neoforge"))
custom {
projectName = "neoforge"
jarLocation = "build/libs/DistantHorizons-neoforge-${rootProject.versionStr}.jar"
}
server {
workingDirectory project.file('run')
arg "-mixin.config=lod.mixins.json"
// Recommended logging data for a userdev environment
// The markers can be changed as needed.
// "SCAN": For mods scan.
// "REGISTRIES": For firing of registry events.
// "REGISTRYDUMP": For getting the contents of all registries.
property 'forge.logging.markers', 'REGISTRIES'
// Recommended logging level for the console
// You can set various levels here.
// Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
property 'forge.logging.console.level', 'debug'
mods {
examplemod {
source sourceSets.main
}
}
if (findProject(":fabric"))
fabric {
jarLocation = "build/libs/DistantHorizons-fabric-${rootProject.versionStr}.jar"
}
data {
workingDirectory project.file('run')
if (findProject(":quilt"))
quilt {
jarLocation = "build/libs/DistantHorizons-quilt-${rootProject.versionStr}.jar"
}
// Recommended logging data for a userdev environment
// The markers can be changed as needed.
// "SCAN": For mods scan.
// "REGISTRIES": For firing of registry events.
// "REGISTRYDUMP": For getting the contents of all registries.
property 'forge.logging.markers', 'REGISTRIES'
removeDuplicate "com.seibel.distanthorizons"
}
// Recommended logging level for the console
// You can set various levels here.
// Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
property 'forge.logging.console.level', 'debug'
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
args '--mod', 'lod', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')
class NativeTransformer implements Transformer {
private boolean enabled = false
private final HashMap<String, String> replacements = new HashMap()
private final HashMap<String, byte[]> rewrittenFiles = new HashMap()
private var nativeRelocator
mods {
examplemod {
source sourceSets.main
}
public File rootDir
NativeTransformer() {
try {
int exitCode = Runtime.getRuntime().exec(new String[]{"python", "--version"}).waitFor()
if (exitCode == 0) {
enabled = true
}
} catch (IOException e) {
println(e)
}
}
void relocateNative(String target, String replacement) {
if (replacement.length() > target.length()) {
throw new GradleException("Length of value \"${replacement}\" exceeds the length of \"${target}\": ${replacement.length()} > ${target.length()}")
}
replacements.put(target, replacement)
}
void before(Closure closure) {
if (enabled)
closure.run()
}
@Override
boolean canTransformResource(@Nonnull FileTreeElement element) {
return enabled && replacements.keySet().stream().anyMatch {
element.name.startsWith(it as String)
}
}
@Override
void transform(@Nonnull TransformerContext context) {
println("Transforming $context.path...")
byte[] content = context.is.readAllBytes()
if (nativeRelocator == null) {
nativeRelocator = new NativeRelocator(rootDir.toPath().resolve("relocate_natives"))
}
try {
Map.Entry<String, String> pathReplacement = replacements.entrySet().stream().filter {
context.path.startsWith(it.key as String)
}.findFirst().orElseThrow()
String path = context.path.replace(pathReplacement.key as String, pathReplacement.value as String)
content = nativeRelocator.processBinary(path, content, replacements)
rewrittenFiles.put(path, content)
}
catch (Throwable e) {
throw new GradleException("Failed to relocate", e)
}
}
@Override
boolean hasTransformedResource() { return !rewrittenFiles.isEmpty() }
@Override
void modifyOutputStream(@Nonnull ZipOutputStream os, boolean preserveFileTimestamps) {
for (Map.Entry<String, byte[]> rewrittenFile : rewrittenFiles.entrySet()) {
os.putNextEntry(new ZipEntry(rewrittenFile.key))
os.write(rewrittenFile.value)
}
}
}
// Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' }
subprojects { p ->
// Does the same as "p == project(":common") || p == project(":fabric") || p == project(":quilt") || p == project(":forge") || p == project("WhateverWeAddLaterOn")"
// Useful later on so we dont have duplicated code
def isMinecraftSubProject = p != project(":core") && p != project(":api")
dependencies {
// Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed
// that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied.
// The userdev artifact is a special name and will get all sorts of transformations applied to it.
minecraft 'net.minecraftforge:forge:1.16.5-36.1.0'
// these were added to hopefully allow for cloning
// configuredFeatures to allow for safe
// multi threaded feature generation. Sadly I couldn't find
// a way to duplicate lambda functions (which features use)
// so for now I'm not sure what to do.
//implementation 'io.github.kostaskougios:cloning:1.10.3'
//
//implementation ('com.esotericsoftware:kryo:5.1.1') {
// exclude group: "org.objenesis"
//}
//implementation 'org.objenesis:objenesis:3.2'
// You may put jars on which you depend on in ./libs or you may define them like so..
// compile "some.group:artifact:version:classifier"
// compile "some.group:artifact:version"
// Real examples
// compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
// compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
// The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
// provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// These dependencies get remapped to your current MCP mappings
// deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// For more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html
}
// Example for how to get properties into the manifest for reading by the runtime..
jar {
manifest {
attributes([
"Specification-Title": "Level of Detail",
"Specification-Version": "1", // We are version 1 of ourselves
"Implementation-Title": project.name,
"Implementation-Version": "{version}",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
"MixinConfigs": "lod.mixins.json",
])
// Apply plugins
apply plugin: "java"
apply plugin: "com.github.johnrengelman.shadow"
if (isMinecraftSubProject)
apply plugin: "systems.manifold.manifold-gradle-plugin"
// Apply forge's loom
if ((findProject(":forge") && p == project(":forge")) ||
(findProject(":neoforge") && p == project(":neoforge"))
)
{
apply plugin: "dev.architectury.loom"
}
}
// Example configuration to allow publishing using the maven-publish task
// This is the preferred method to reobfuscate your jar file
jar.finalizedBy('reobfJar')
// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing
//publish.dependsOn('reobfJar')
publishing {
publications {
mavenJava(MavenPublication) {
artifact jar
// Set the manifold version (may not be required tough)
manifold {
manifoldVersion = rootProject.manifold_version
}
// set up custom configurations (configurations are a way to handle dependencies)
configurations {
// extends the shadowJar configuration
shadowMe
// have implemented dependencies automatically embedded in the final jar
implementation.extendsFrom(shadowMe)
// Configuration fpr core & api
coreProjects
shadowMe.extendsFrom(coreProjects)
// FIXME this additional configuration is necessary because forge
// needs forgeRuntimeLibrary, although adding it to shadowMe
// causes runtime issues where the libraries aren't properly added
forgeShadowMe
// this should match shadowMe pretty closely
implementation.extendsFrom(forgeShadowMe)
shadowMe.extendsFrom(forgeShadowMe)
forgeRuntimeLibrary.extendsFrom(forgeShadowMe)
if (isMinecraftSubProject && p != project(":common")) {
// Shadow common
common
shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
compileClasspath.extendsFrom common
runtimeClasspath.extendsFrom common
if (findProject(":forge"))
developmentForge.extendsFrom common
if (findProject(":neoforge"))
developmentNeoForge.extendsFrom common
compileClasspath.extendsFrom coreProjects
runtimeClasspath.extendsFrom coreProjects
if (findProject(":forge"))
developmentForge.extendsFrom coreProjects
if (findProject(":neoforge"))
developmentNeoForge.extendsFrom coreProjects
// TODO remove unused fabricLike
if (findProject(":fabricLike") && p != project(":fabricLike")) {
// Shadow fabricLike
fabricLike
shadowFabricLike
compileClasspath.extendsFrom fabricLike
runtimeClasspath.extendsFrom fabricLike
}
}
}
dependencies {
//=====================//
// shared dependencies //
//=====================//
// Manifold
if (isMinecraftSubProject) {
annotationProcessor("systems.manifold:manifold-preprocessor:${rootProject.manifold_version}")
}
// Log4j
if (p == project(":core"))
{
// the standalone core jar needs logging shaded otherwise it won't run
forgeShadowMe("org.apache.logging.log4j:log4j-api:${rootProject.log4j_version}")
forgeShadowMe("org.apache.logging.log4j:log4j-core:${rootProject.log4j_version}")
}
else
{
// When running in MC, MC already includes logging
implementation("org.apache.logging.log4j:log4j-api:${rootProject.log4j_version}")
implementation("org.apache.logging.log4j:log4j-core:${rootProject.log4j_version}")
}
// JOML
if (project.hasProperty("embed_joml") && embed_joml == "true")
forgeShadowMe("org.joml:joml:${rootProject.joml_version}")
else
implementation("org.joml:joml:${rootProject.joml_version}")
// JUnit tests
implementation("org.junit.jupiter:junit-jupiter:5.8.2")
implementation("org.junit.jupiter:junit-jupiter-engine:5.8.2")
implementation("junit:junit:4.13")
// FastUtil
// Note: MC 1.16 uses 8.2.1, and versions after use 8.5.12
// We cannot relocate this library since we call some MC classes that reference it
implementation("it.unimi.dsi:fastutil:${rootProject.fastutil_version}")
// Compression
forgeShadowMe("org.lz4:lz4-java:${rootProject.lz4_version}") // LZ4
forgeShadowMe("org.tukaani:xz:${rootProject.xz_version}") // LZMA
// Sqlite Database
forgeShadowMe("org.xerial:sqlite-jdbc:${rootProject.sqlite_jdbc_version}")
// NightConfig (includes Toml & Json)
forgeShadowMe("com.electronwill.night-config:toml:${rootProject.nightconfig_version}")
forgeShadowMe("com.electronwill.night-config:json:${rootProject.nightconfig_version}")
// SVG (not needed atm)
// forgeShadowMe("com.formdev:svgSalamander:${rootProject.svgSalamander_version}")
// Netty
implementation("io.netty:netty-buffer:${rootProject.netty_version}")
// Remember, for lwjgl dependencies that arent included in Minecraft, you need to also need to add it to the ShadowJar thing
forgeShadowMe("org.lwjgl:lwjgl-jawt:${rootProject.lwjgl_version}") {
exclude group: "org.lwjgl", module: "lwjgl" // This module is imported by Minecraft so exclude it
}
//==========================//
// conditional dependencies //
//==========================//
// Add core
if (isMinecraftSubProject) {
coreProjects(project(":core")) {
// Remove Junit test libraries
exclude group: "org.junit.jupiter", module: "junit-jupiter"
exclude group: "org.junit.jupiter", module: "junit-jupiter-engine"
exclude group: "junit", module: "junit"
// Removed dependencies
transitive false
}
}
// Add the api
if (p != project(":api")) {
coreProjects(project(":api")) {
// Remove Junit test libraries
exclude group: "org.junit.jupiter", module: "junit-jupiter"
exclude group: "org.junit.jupiter", module: "junit-jupiter-engine"
exclude group: "junit", module: "junit"
// Removed dependencies
transitive false
}
}
// Add common
if (isMinecraftSubProject && p != project(":common")) {
// Common
common(project(":common")) { transitive false }
shadowCommon(project(":common")) { transitive false }
// FabricLike
if (findProject(":fabricLike") && p != project(":fabricLike")) {
fabricLike(project(path: ":fabricLike")) { transitive false }
shadowFabricLike(project(path: ":fabricLike")) { transitive false }
}
}
}
shadowJar {
configurations = [project.configurations.shadowMe]
if (isMinecraftSubProject && p != project(":common")) {
configurations.push(project.configurations.shadowCommon) // Shadow the common subproject
relocate "com.seibel.distanthorizons.common", "loaderCommon.${p.name}.com.seibel.distanthorizons.common" // Move the loader files to a different location
if (findProject(":fabricLike") && p != project(":fabricLike")) {
configurations.push(project.configurations.shadowFabricLike) // Shadow the fabricLike subproject
relocate "com.seibel.distanthorizons.fabriclike", "loaderCommon.${p.name}.com.seibel.distanthorizons.fabriclike" // Move the loader files to a different location
}
}
def librariesLocation = "DistantHorizons.libraries"
// LWJGL
// Only ever shadow the dependencies we use otherwise some stuff would break when running on an external client
relocate "org.lwjgl.system.jawt", "${librariesLocation}.lwjgl.system.jawt"
// Compression (LZ4)
relocate "net.jpountz", "${librariesLocation}.jpountz"
// Logging
relocate "org.slf4j", "${librariesLocation}.slf4j"
// Sqlite Database
// librariesLocation isn't used because it's too long for replacing paths in native libraries
// Allowing strings larger than the original string would require shifting the entire binary's contents
transform(NativeTransformer) {
rootDir = project.rootDir
before {
relocate "org.sqlite", "dh_sqlite", {
exclude "org/sqlite/native/**"
}
relocate "jdbc:sqlite", "jdbc:dh_sqlite"
}
relocateNative "org/sqlite", "dh_sqlite"
relocateNative "org_sqlite", "dh_1sqlite"
}
// JOML
if (project.hasProperty("embed_joml") && embed_joml == "true")
relocate "org.joml", "${librariesLocation}.joml"
// NightConfig (includes Toml & Json)
relocate "com.electronwill.nightconfig", "${librariesLocation}.electronwill.nightconfig"
// SVG (not needed atm)
// relocate "com.kitfox.svg", "${librariesLocation}.kitfox.svg"
// Netty
// Don't relocate, it causes problems with using MC's FriendlyByteBufs
// relocate "io.netty", "${librariesLocation}.netty"
mergeServiceFiles()
}
// Using jar.finalizedBy(shadowJar) causes issues so we do this scuffed bypass
jar.dependsOn(shadowJar)
// Put stuff from gradle.properties into the mod info
processResources {
def resourceTargets = [ // Location of where to inject the properties
// Holds info like git commit
// TODO: For some reason this script doesnt work with the core project
"build_info.json",
// Properties for each of the loaders
"fabric.mod.json",
"quilt.mod.json",
"META-INF/mods.toml",
"META-INF/neoforge.mods.toml",
// The mixins for each of the loaders
"DistantHorizons."+ p.name +".fabricLike.mixins.json"
]
def intoTargets = ["$buildDir/resources/main/"] // Location of the built resources folder
// Fix forge version numbering system as it is weird
// For whatever reason forge uses [1.18, 1.18.1, 1.18.2) instead of the standard ["1.18", "1.18.1", "1.18.2"]
def compatible_forgemc_versions = "${compatible_minecraft_versions}".replaceAll("\"", "").replaceAll("]", ",)")
// println compatible_forgemc_versions
// Quilt's custom contributors system
// This has to be like
// "Person": "Developer", "Another person": "Developer"
def quilt_contributors = []
def mod_author_list = mod_authors.replaceAll("\"", "").replace("[", "").replace("]", "").split(",")
for (dev in mod_author_list) {
quilt_contributors.push("\"${dev.strip()}\": \"Developer\"")
}
quilt_contributors.reverse()
//println quilt_contributors.join(", ")
// TODO: Find something we can use so we can basically re-map only when the jar is shadowed and relocated
// println p.tasks.findByName('shadowJar')
// These "hasProperty"'s are so that they can be passed through the cli (ie in the CI)
try {
if (infoGitCommit == "null")
infoGitCommit = 'git rev-parse --verify HEAD'.execute().text.trim()
if (infoGitBranch == "null")
infoGitBranch = 'git symbolic-ref --short HEAD'.execute().text.trim()
} catch (Exception e) {
infoGitCommit = infoGitBranch = "Git not found"
println "Git or Git project not found"
}
// 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
def replaceProperties = [
version : mod_version,
mod_name : mod_readable_name,
group : maven_group,
authors : mod_authors,
description : mod_description,
homepage : mod_homepage,
source : mod_source,
issues : mod_issues,
discord : mod_discord,
minecraft_version : minecraft_version,
compatible_minecraft_versions: compatible_minecraft_versions,
compatible_forgemc_versions : compatible_forgemc_versions,
java_version : java_version,
quilt_contributors : "{"+quilt_contributors.join(", ")+"}",
info_git_commit : infoGitBranch,
info_git_branch : infoGitCommit,
info_build_source : infoBuildSource,
fabric_incompatibility_list : fabric_incompatibility_list,
fabric_recommend_list : fabric_recommend_list,
]
// replace any properties in the sub-projects with the values defined here
inputs.properties replaceProperties
replaceProperties.put "project", project
filesMatching(resourceTargets) {
expand replaceProperties
}
intoTargets.each { target ->
if (file(target).exists()) {
copy {
from(sourceSets.main.resources) {
include resourceTargets
expand replaceProperties
}
into target
}
}
}
// ==================== Delete un-needed files ====================
exclude "DistantHorizons.fabricLike.mixins.json" // This isnt required atm, but we will be using it later
// exclude "*.distanthorizons.accesswidener"
//// include "${accessWidenerVersion}.distanthorizons.accesswidener"
// Jank solution to remove all unused accesswideners
// The line above would work..., except that (neo)forge (well, mainly architectury) requires the original accesswidener file, meaning we require this jank solution to keep it
exclude { file ->
if (file.name.contains(".distanthorizons.accesswidener") && file.name != "${accessWidenerVersion}.distanthorizons.accesswidener") {
return true
}
return false
}
}
// Adds the standalone jar's entrypoint
jar {
from "LICENSE.txt"
manifest {
attributes(
'Implementation-Title': rootProject.mod_name,
'Implementation-Version': rootProject.mod_version,
'Multi-Release': true, // needed for logging in the standalone core jar
'Main-Class': 'com.seibel.distanthorizons.core.jar.JarMain', // When changing the main of the jar change this line
)
}
}
// this can be un-commented if we ever wanted to make DH modular (AKA use a module-info.java file) again
/*
// Tells gradle where to look for other modules
// Why isn't the classpath added to the modules path by default?
if (p == project(":core")) {
compileJava {
inputs.property('moduleName', 'dhApi')
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath
]
classpath = files()
}
}
}
*/
}
allprojects { p ->
// Does the same as "p == project(":common") || p == project(":fabric") || p == project(":quilt") || p == project(":forge") || p == project("WhateverWeAddLaterOn")"
// Useful later on so we dont have duplicated code
def isMinecraftSubProject = p != project(":core") && p != project(":api")
apply plugin: "java"
apply plugin: "maven-publish"
archivesBaseName = rootProject.mod_name
version = project.name + "-" + rootProject.versionStr
group = rootProject.maven_group
// this is the text that appears at the top of the overview (home) page
// and is used when bookmarking a page
javadoc.title = rootProject.mod_name + "-" + project.name
// Some annotations arent "technically" part of the official java standard,
// so we define it ourself here
javadoc {
configure( options ) {
tags(
'todo:X"',
'apiNote:a:API Note:',
'implSpec:a:Implementation Requirements:',
'implNote:a:Implementation Note:'
)
}
}
repositories {
// Mojang overrides (added to fix downloading the wrong LWJGL libs on M1 Mac's and potentially other arm64 based machines)
maven { url "https://libraries.minecraft.net/" }
// The central repo
mavenCentral()
// Used for Google's Collect library
maven { url "https://repo.enonic.com/public/" }
// For parchment mappings
// versions can be found here: https://ldtteam.jfrog.io/ui/native/parchmentmc-public/org/parchmentmc/data/
maven { url "https://maven.parchmentmc.org" }
// For Architectury API
maven { url "https://maven.architectury.dev" }
// For Git repositories
maven { url "https://jitpack.io" }
// For Manifold Preprocessor
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
// Required for importing Modrinth mods
maven {
url "file:///${project.projectDir}/mcmodsrepo"
name = "Modrinth"
url = "https://api.modrinth.com/maven"
content {
includeGroup "maven.modrinth"
}
}
// Required for importing CursedForge mods
maven {
url "https://www.cursemaven.com"
content {
includeGroup "curse.maven"
}
}
// VanillaGradle and Mixins in common
maven { url "https://repo.spongepowered.org/maven/" }
// Canvas mod
maven { url "https://maven.vram.io/" }
// ModMenu mod
maven { url "https://maven.terraformersmc.com/" }
// neoforge
maven { url "https://maven.neoforged.net/releases/" }
// These 3 are for importing mods that arnt on CursedForge, Modrinth, GitHub, GitLab or anywhere opensource
flatDir {
dirs "${rootDir}/mods/fabric"
content {
includeGroup "fabric-mod"
}
}
flatDir {
dirs "${rootDir}/mods/quilt"
content {
includeGroup "quilt-mod"
}
}
flatDir {
dirs "${rootDir}/mods/forge"
content {
includeGroup "forge-mod"
}
}
// TODO: If neoforged is ever needed, should we use that, or call it a forge mod?
}
// Adds some dependencies that are in vanilla but not in core
if (p == project(":core")) {
OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem;
// Set the OS lwjgl is using to the current os
project.ext.lwjglNatives = "natives-" + os.toFamilyName()
dependencies { // All of these dependencies are in Vanilla Minecraft, but we need to depend on it as we arent importing Minecraft in the core
// Imports most of lwjgl's libraries (well, only the ones that we need)
implementation platform("org.lwjgl:lwjgl-bom:${rootProject.lwjgl_version}") // TODO: Use Minecraft's version for lwjgl_version (which changes in nearly every version) instead of a hard defined version for all versions
// REMEMBER: Dont shadow stuff here, these are just the libs that are included in Minecraft so that the core can use
implementation "org.lwjgl:lwjgl"
implementation "org.lwjgl:lwjgl-assimp"
implementation "org.lwjgl:lwjgl-glfw"
implementation "org.lwjgl:lwjgl-openal"
implementation "org.lwjgl:lwjgl-opengl"
implementation "org.lwjgl:lwjgl-stb"
implementation "org.lwjgl:lwjgl-tinyfd"
runtimeOnly "org.lwjgl:lwjgl::$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-assimp::$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-glfw::$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-openal::$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-opengl::$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-stb::$lwjglNatives"
runtimeOnly "org.lwjgl:lwjgl-tinyfd::$lwjglNatives"
implementation "org.joml:joml:${rootProject.joml_version}"
// Some other dependencies
implementation("org.jetbrains:annotations:16.0.2")
implementation("com.google.code.findbugs:jsr305:3.0.2")
implementation("com.google.common:google-collect:0.5")
implementation("com.google.guava:guava:31.1-jre")
}
}
task copyCommonLoaderResources(type: Copy) {
from project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
into(file(p.file("build/resources/main")))
rename "${accessWidenerVersion}.distanthorizons.accesswidener", "distanthorizons.accesswidener"
// Move the fabricLike mixin to its different places for each subproject
if (findProject(":fabricLike")) {
from project(":fabricLike").file("src/main/resources/DistantHorizons.fabricLike.mixins.json")
into(file(p.file("build/resources/main")))
rename "DistantHorizons.fabricLike.mixins.json", "DistantHorizons." + p.name + ".fabricLike.mixins.json"
}
}
task copyCoreResources(type: Copy) {
from fileTree(project(":core").file("src/main/resources"))
into p.file("build/resources/main")
}
tasks.withType(JavaCompile) {
if (isMinecraftSubProject) {
options.release = rootProject.java_version as Integer
} else {
options.release = 8; // Core & Api should use Java 8 no matter what
//options.release = rootProject.java_version as Integer // But if you want to test some stuff, then this can be enabled
}
options.encoding = "UTF-8"
}
java {
withSourcesJar()
}
}
mixin {
add sourceSets.main, "lod.refmap.json"
// Delete the merged folder when running clean
task cleanMergedJars() {
def mergedFolder = file("Merged")
if (mergedFolder.exists()) {
delete(mergedFolder)
}
}
// add cleanMergedJars to the end of the "clean" task
tasks["clean"].finalizedBy(cleanMergedJars)
Executable
+28
View File
@@ -0,0 +1,28 @@
#!/bin/sh
echo "==================== Note: All build jars will be in the folder called 'buildAllJars' ===================="
mkdir -p buildAllJars
rm -rf buildAllJars/*
# Loop trough everything in the version properties folder
for d in versionProperties/*; do
# Get the name of the version that is going to be compiled
version=$(echo "$d" | sed "s/versionProperties\///" | sed "s/.properties//")
# Clean out the folders, build it, and merge it
# (We could use "./" to run gradlew, but as it is a shell script im going to be running it with the "sh" command)
echo "==================== Cleaning workspace to build $version ===================="
sh gradlew clean -PmcVer=$version
if [ $? != 0 ]; then continue; fi
echo "====================Building $version ===================="
sh gradlew build -PmcVer=$version
if [ $? != 0 ]; then continue; fi
echo "==================== Merging $version ===================="
sh gradlew mergeJars -PmcVer=$version
if [ $? != 0 ]; then continue; fi
echo "==================== Moving jar ===================="
mv Merged/*.jar buildAllJars/
done
+26
View File
@@ -0,0 +1,26 @@
@echo off & setlocal enabledelayedexpansion
@rem Note for devs: If this script doesnt work, please look at the unix buildAll script
@rem This script was originally created on linux, so there may be some problems with this translation
echo ==================== Note: All build jars will be in the folder called 'buildAllJars' ====================
mkdir buildAllJars
del buildAllJars/*
@rem Loop trough everything in the version properties folder
for %%f in (versionProperties\*) do (
@rem Get the name of the version that is going to be compiled
set version=%%~nf
@rem Clean out the folders, build it, and merge it
echo ==================== Cleaning workspace to build !version! ====================
call .\gradlew.bat clean
echo ==================== Building !version! ====================
call .\gradlew.bat build -PmcVer="!version!"
echo ==================== Merging !version! ====================
call .\gradlew.bat mergeJars -PmcVer="!version!"
echo ==================== Moving jar ====================
move Merged\*.jar buildAllJars\
)
endlocal
+239
View File
@@ -0,0 +1,239 @@
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AWToAT {
private static final Map<String, String> ACCESS_POINT_MAP = new HashMap<>();
static {
ACCESS_POINT_MAP.put("accessible", "public");
ACCESS_POINT_MAP.put("extendable", "public-f");
ACCESS_POINT_MAP.put("mutable", "public-f");
}
public String minecraftVersion;
public File remap(File file, String minecraftVersion) {
this.minecraftVersion = minecraftVersion.replace("_", ".");
File atFile = createATFile(file);
processFile(file, atFile);
return atFile;
}
private File createATFile(File file) {
File metaInf = new File(file.getParentFile(), "META-INF");
if (!metaInf.exists() && !metaInf.mkdir()) throw new RuntimeException("Error creating META-INF folder");
File atFile = new File(metaInf, "accesstransformer.cfg");
try {
atFile.createNewFile();
} catch (IOException e) {
throw new RuntimeException("Error creating new file", e);
}
return atFile;
}
private void processFile(File file, File atFile) {
/* Validates if we need to recreate the Access Transformer file if it's out of date */
// Get the hash of the file
String fileHash = getFileHash(file);
try (Scanner atScanner = new Scanner(atFile)) {
// Check if the AT file is up-to-date by comparing the hash of the file with the hash stored in the AT file
boolean hashFound = false;
while (atScanner.hasNextLine()) {
String line = atScanner.nextLine();
if (hashCheck(line, fileHash)) {
hashFound = true;
}
}
// If the AT file is up-to-date, print a message and return
if (hashFound) {
System.out.println("Access Transformer file is already up to date.");
return;
}
} catch (FileNotFoundException ignored) {
// If the AT file does not exist, continue
}
/* Creates the Access Transformer file */
// Opens a scanner for reading the Access Widener file and a writer for writing to the Access Transformer file
try (Scanner scanner = new Scanner(file); FileWriter writer = new FileWriter(atFile)) {
// Create an ExecutorService with a fixed thread pool size equal to the number of available processors
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
// List to hold Future objects representing results of computation
List<Future<String>> futures = new ArrayList<>();
// Write the hash of the file to the AT file
writer.write("#DH_MAPPING_HASH:" + fileHash + "\n");
// Read each line from the file
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
// Skip lines starting with "accessWidener", "#" or blank lines
if (line.startsWith("accessWidener") || line.startsWith("#") || line.isBlank()) continue;
// Submit the line to the executor service for processing
// The processing is done by the processLine method
futures.add(executor.submit(() -> processLine(line.split(" "))));
}
// Write the results to the output file
// The results are obtained by calling the get method on each Future
for (Future<String> future : futures) {
writer.write(future.get());
}
// Shutdown the executor service to free up resources
executor.shutdown();
} catch (Exception e) {
throw new RuntimeException("Error reading or writing to file", e);
}
}
private String processLine(String[] fields) {
// fields[0] = access point like "accessible", "extendable", "mutable"
// fields[1] = type like "field", "method", "class"
// fields[2] = class name
// fields[3] = field/method name
// fields[4] = field/method descriptor
try {
// Store the original field/method name
String originalName = "";
// If there is a class name, replace the slashes with dots in the package name
if (fields.length > 2) fields[2] = fields[2].replace("/", ".");
// If there is a field/method name, store the original name and remap it to SRG
if (fields.length > 3) {
originalName = fields[3];
fields[3] = remapToSRG(fields[2], fields[3]);
}
StringBuilder line = new StringBuilder(ACCESS_POINT_MAP.getOrDefault(fields[0], "public")).append(" ");
switch (fields[1]) {
case "field":
line.append(fields[2]).append(" ").append(fields[3]).append(" #").append(originalName);
// It'll be like: access-point class-name field-name-SRG # field-name-Mojmap
// Eg: public net.minecraft.client.Minecraft f_90981_ # instance
break;
case "method":
line.append(fields[2]).append(" ").append(fields[3]).append(fields[4]).append(" #").append(originalName);
// It'll be like: access-point class-name method-name-SRG method-descriptor # method-name-Mojmap
// Eg: public net.minecraft.client.Minecraft m_172797_()Lnet/minecraft/client/Minecraft; # getInstance
break;
default:
line.append(fields[2]);
// It'll be like: access-point class-name
// Eg: public net.minecraft.client.Minecraft
break;
}
line.append("\n");
return line.toString();
} catch (Exception e) {
throw new RuntimeException("Error processing line", e);
}
}
private boolean hashCheck(String line, String fileHash) {
if (line.startsWith("#DH_MAPPING_HASH:")) {
String hash = line.substring(17);
return hash.equals(fileHash);
}
return false;
}
public String getFileHash(File file) {
try {
MessageDigest shaDigest = MessageDigest.getInstance("SHA-256");
try (InputStream fis = new FileInputStream(file)) {
byte[] byteArray = new byte[1024];
int bytesCount;
// Read file data and update in message digest
while ((bytesCount = fis.read(byteArray)) != -1) {
shaDigest.update(byteArray, 0, bytesCount);
}
}
byte[] bytes = shaDigest.digest();
// Convert byte array into signum representation
StringBuilder sb = new StringBuilder();
for (byte aByte : bytes) {
sb.append(Integer.toString((aByte & 0xff) + 0x100, 16).substring(1));
}
// Return complete hash
return sb.toString();
} catch (NoSuchAlgorithmException | IOException e) {
throw new RuntimeException(e);
}
}
// WARNING: BELOW LIES HIGHLY CURSED CODE AND MIGHT EVEN BE ILLEGAL
// Flag to track if there was an error in the GET request
boolean error = false;
/**
* This method returns a field or method name from Mojang mappings as SRG mappings.
* It makes a GET request to the Linkie API to fetch the SRG name.
*
* @param clazz The class name
* @param name The field or method name
* @return The SRG name
* @throws Exception If there is an error in the GET request or the SRG name is not found in the response
*/
private String remapToSRG(String clazz, String name) throws Exception {
// Encode the class and field/method name to be used in the URL
String query = URLEncoder.encode(clazz + "." + name, StandardCharsets.UTF_8);
// Construct the URL for the GET request
String urlString = "https://linkieapi.shedaniel.me/api/search?namespace=mojang&query=" + query + "&version=" + this.minecraftVersion + "&limit=1&allowClasses=false&allowFields=true&allowMethods=true&translate=mojang_srg";
URL url = new URI(urlString).toURL();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
// Read the response line by line
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
conn.disconnect();
// Regex to find the SRG name in the response
Pattern pattern = Pattern.compile("\"l\"\\s*:\\s*\\{[^}]*\"i\"\\s*:\\s*\"([^\"]*)\"");
Matcher matcher = pattern.matcher(content.toString());
if (matcher.find()) return matcher.group(1);
else throw new Exception("Couldn't find the SRG mapping for name: " + name + "\nCould not find 'i' in 'l' object in the response"); // `i` is the SRG name which is stored in the `l` JSON object
} else {
if (error) {
// If there was an error in the GET request, and we already tried again, throw an exception
throw new Exception("The GET request failed");
}
// If there was an error in the GET request, wait 2.5 seconds and try again as we probably got rate limited
error = true;
Thread.sleep(2500);
return remapToSRG(clazz, name);
}
}
}
+207
View File
@@ -0,0 +1,207 @@
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
class NativeRelocator
{
private final Path rootDirectory;
private final Path cacheRoot;
/**
* Initializes the NativeRelocator by preparing the environment if necessary.
* Executes the appropriate preparation script based on the OS.
*
* @throws Exception if the preparation script fails or an unsupported OS is detected.
*/
NativeRelocator(Path rootDirectory) throws Exception
{
this.rootDirectory = rootDirectory;
this.cacheRoot = this.rootDirectory.resolve("cache");
if (this.rootDirectory.resolve(".venv").toFile().exists())
{
return;
}
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.directory(this.rootDirectory.toFile());
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win"))
{
processBuilder.command("powershell", "-ExecutionPolicy", "Bypass", "./prepare.ps1");
}
else if (os.contains("nix") || os.contains("nux") || os.contains("mac"))
{
processBuilder.command("./prepare.sh");
}
else
{
throw new IllegalStateException("Unsupported operating system: " + os);
}
Process process = processBuilder.start();
CompletableFuture<Void> outputFuture = readOutputStreams(process);
int exitCode = process.waitFor();
outputFuture.get();
if (exitCode != 0)
{
throw new Exception("Prepare failed: " + exitCode);
}
}
/**
* Reads and prints the output and error streams of a process asynchronously.
*
* @param process The process whose streams should be read.
* @return A CompletableFuture that completes once all output has been processed.
*/
private static CompletableFuture<Void> readOutputStreams(Process process)
{
return CompletableFuture.runAsync(() -> {
try
{
while (process.isAlive() || process.getInputStream().available() > 0 || process.getErrorStream().available() > 0)
{
if (process.getInputStream().available() > 0)
{
byte[] data = new byte[process.getInputStream().available()];
//noinspection ResultOfMethodCallIgnored
process.getInputStream().read(data);
System.out.write(data);
}
if (process.getErrorStream().available() > 0)
{
byte[] data = new byte[process.getErrorStream().available()];
//noinspection ResultOfMethodCallIgnored
process.getErrorStream().read(data);
System.err.write(data);
}
//noinspection BusyWait
Thread.sleep(100);
}
}
catch (Throwable ignored)
{
}
});
}
/**
* Replaces occurrences of a target string in a byte array, ensuring null termination.
*
* @param byteArray The byte array where replacements should occur.
* @param target The string to replace.
* @param replacement The replacement string (must not be longer than the target).
* @throws IllegalArgumentException if the replacement is longer than the target.
*/
private void replaceInNullTerminatedStrings(byte[] byteArray, String target, String replacement)
{
if (target.length() < replacement.length())
{
throw new IllegalArgumentException("Replacement must be the same length or shorter than the target.");
}
byte[] targetBytes = target.getBytes(StandardCharsets.US_ASCII);
byte[] replacementBytes = replacement.getBytes(StandardCharsets.US_ASCII);
byte nullByte = 0;
for (int endPos = 0; endPos < byteArray.length - targetBytes.length - 1; endPos++)
{
int startPos = endPos;
int targetPos = 0;
while (targetPos < targetBytes.length && byteArray[endPos] == targetBytes[targetPos])
{
targetPos++;
endPos++;
}
if (targetPos == targetBytes.length)
{
System.arraycopy(replacementBytes, 0, byteArray, startPos, replacementBytes.length);
startPos = startPos + replacementBytes.length;
while (byteArray[endPos] != nullByte)
{
byteArray[startPos] = byteArray[endPos];
endPos++;
startPos++;
}
byteArray[startPos] = nullByte;
}
}
}
/**
* Runs an external script to fix a modified binary and returns the processed content.
*
* @param outputFilePath Path to store the processed binary.
* @param content The original binary content.
* @return The modified binary content.
* @throws Exception if the process execution fails.
*/
public byte[] fixModifiedBinary(Path outputFilePath, byte[] content) throws Exception
{
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.directory(this.rootDirectory.toFile());
processBuilder.command(
this.rootDirectory.resolve(".venv/Scripts").toFile().exists()
? this.rootDirectory.resolve(".venv/Scripts/python.exe").toString()
: this.rootDirectory.resolve(".venv/bin/python").toString(),
"./fix_modified_binary.py",
outputFilePath.toString()
);
Process process = processBuilder.start();
CompletableFuture<Void> outputFuture = readOutputStreams(process);
process.getOutputStream().write(content);
process.getOutputStream().close();
int exitCode = process.waitFor();
outputFuture.get();
if (exitCode != 0)
{
throw new Exception("Process failed: " + exitCode);
}
return Files.readAllBytes(outputFilePath);
}
/**
* Processes a binary file, applying string replacements and fixing modifications.
*
* @param outputPath The output file path relative to the cache directory.
* @param content The binary content to process.
* @param replacements A map of string replacements to apply.
* @return The modified binary content.
* @throws Exception if processing fails.
*/
public byte[] processBinary(String outputPath, byte[] content, Map<String, String> replacements) throws Exception
{
Path outputFilePath = this.cacheRoot.resolve(outputPath);
//noinspection ResultOfMethodCallIgnored
outputFilePath.getParent().toFile().mkdirs();
if (outputFilePath.toFile().exists())
{
return Files.readAllBytes(outputFilePath);
}
for (Map.Entry<String, String> replacement : replacements.entrySet())
{
this.replaceInNullTerminatedStrings(content, replacement.getKey(), replacement.getValue());
}
return this.fixModifiedBinary(outputFilePath, content);
}
}
+78
View File
@@ -0,0 +1,78 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the team lead James Seibel through Discord at `@backsun`. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
+41
View File
@@ -0,0 +1,41 @@
// temporary fix for broken spongepowered version
buildscript {
configurations.configureEach {
resolutionStrategy {
force 'org.spongepowered:vanillagradle:0.2.1-20240507.024226-82'
// newer versions can be found by going to the link:
// https://repo.spongepowered.org/#browse/browse:maven-public:org%2Fspongepowered%2Fvanillagradle%2F0.2.1-SNAPSHOT
}
}
}
plugins {
id "org.spongepowered.gradle.vanilla" version "0.2.1-SNAPSHOT"
}
minecraft {
accessWideners(project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener"))
version(rootProject.minecraft_version)
}
dependencies {
// So mixins can be written in common
compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5'
}
publishing {
publications {
mavenCommon(MavenPublication) {
artifactId = rootProject.mod_readable_name
from components.java
}
}
// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
repositories {
// Add repositories to publish to here.
}
}
@@ -0,0 +1,298 @@
package com.seibel.distanthorizons.common;
import com.mojang.brigadier.CommandDispatcher;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeDhInitEvent;
import com.seibel.distanthorizons.common.commands.CommandInitializer;
import com.seibel.distanthorizons.common.wrappers.DependencySetup;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftServerWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.api.internal.SharedApi;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.config.ConfigBase;
import com.seibel.distanthorizons.core.config.eventHandlers.presets.ThreadPresetConfigEventHandler;
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.jar.ModJarInfo;
import com.seibel.distanthorizons.core.jar.updater.SelfUpdater;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModAccessor;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import com.seibel.distanthorizons.coreapi.ModInfo;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.dedicated.DedicatedServer;
import org.apache.logging.log4j.Logger;
import java.lang.invoke.MethodHandles;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* Base for all mod loader initializers
* and handles most setup.
*/
public abstract class AbstractModInitializer
{
protected static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
private CommandInitializer commandInitializer;
//==================//
// abstract methods //
//==================//
protected abstract void createInitialBindings();
protected abstract IEventProxy createClientProxy();
protected abstract IEventProxy createServerProxy(boolean isDedicated);
protected abstract void initializeModCompat();
protected abstract void subscribeRegisterCommandsEvent(Consumer<CommandDispatcher<CommandSourceStack>> eventHandler);
protected abstract void subscribeClientStartedEvent(Runnable eventHandler);
protected abstract void subscribeServerStartingEvent(Consumer<MinecraftServer> eventHandler);
protected abstract void runDelayedSetup();
//===================//
// initialize events //
//===================//
public void onInitializeClient()
{
DependencySetup.createClientBindings();
LOGGER.info("Initializing " + ModInfo.READABLE_NAME + " client.");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null);
this.startup();
this.logBuildInfo();
this.createClientProxy().registerEvents();
this.createServerProxy(false).registerEvents();
this.initializeModCompat();
LOGGER.info(ModInfo.READABLE_NAME + " client Initialized.");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null);
// Client uses config for auto-updater, so it's initialized here instead of post-init stage
this.initConfig();
logModIncompatibilityWarnings(); // needs to be called after config loading
this.subscribeClientStartedEvent(this::postInit);
}
public void onInitializeServer()
{
DependencySetup.createServerBindings();
LOGGER.info("Initializing " + ModInfo.READABLE_NAME + " server.");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null);
this.startup();
this.logBuildInfo();
// This prevents returning uninitialized Config values,
// resulting from a circular reference mid-initialization in a static class
// noinspection ResultOfMethodCallIgnored
ThreadPresetConfigEventHandler.INSTANCE.toString();
this.createServerProxy(true).registerEvents();
this.initializeModCompat();
LOGGER.info(ModInfo.READABLE_NAME + " server Initialized.");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null);
this.subscribeRegisterCommandsEvent(dispatcher -> { this.commandInitializer = new CommandInitializer(dispatcher); });
this.subscribeServerStartingEvent(server ->
{
MinecraftServerWrapper.INSTANCE.dedicatedServer = (DedicatedServer)server;
this.initConfig();
this.postInit();
this.commandInitializer.initCommands();
this.checkForUpdates();
LOGGER.info("Dedicated server initialized at " + server.getServerDirectory());
});
}
//===========================//
// inner initializer methods //
//===========================//
private void startup()
{
DependencySetup.createSharedBindings();
SharedApi.init();
this.createInitialBindings();
}
private void logBuildInfo()
{
LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION);
// if the build is stable the branch/commit/etc shouldn't be needed
if (ModInfo.IS_DEV_BUILD)
{
LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch);
LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit);
LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source);
}
}
protected <T extends IModAccessor> void tryCreateModCompatAccessor(String modId, Class<? super T> accessorClass, Supplier<T> accessorConstructor)
{
IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class);
if (modChecker.isModLoaded(modId))
{
//noinspection unchecked
ModAccessorInjector.INSTANCE.bind((Class<? extends IModAccessor>) accessorClass, accessorConstructor.get());
}
}
private void initConfig()
{
ConfigBase.INSTANCE = new ConfigBase(ModInfo.ID, ModInfo.NAME, Config.class, ModInfo.CONFIG_FILE_VERSION);
Config.completeDelayedSetup();
}
private void checkForUpdates()
{
if (Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get())
{
if (Config.Client.Advanced.AutoUpdater.enableSilentUpdates.get())
{
LOGGER.info("Silent updates are not allowed for dedicated servers; force disabling.");
Config.Client.Advanced.AutoUpdater.enableSilentUpdates.set(false);
}
SelfUpdater.onStart();
}
}
private void postInit()
{
LOGGER.info("Post-Initializing Mod");
this.runDelayedSetup();
LOGGER.info("Mod Post-Initialized");
}
//==================================//
// mod partial compatibility checks //
//==================================//
/**
* Some mods will work with a few tweaks
* or will partially work but have some known issues we can't solve.
* This method will log (and display to chat if enabled)
* these warnings and potential fixes.
*/
private static void logModIncompatibilityWarnings()
{
boolean showChatWarnings = Config.Common.Logging.Warning.showModCompatibilityWarningsOnStartup.get();
IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class);
String startingString = "Partially Incompatible Distant Horizons mod detected: ";
// Alex's caves
if (modChecker.isModLoaded("alexscaves"))
{
// There've been a few reports about this mod breaking DH at a few different points in time
// the fixes for said breakage changes depending on the version so unfortunately
// all we can do is log a warning so the user can handle it.
if (showChatWarnings)
{
String message =
// orange text
"\u00A76" + "Distant Horizons: Alex's Cave detected." + "\u00A7r\n" +
"You may have to change Alex's config for DH to render. ";
ClientApi.INSTANCE.showChatMessageNextFrame(message);
}
LOGGER.warn(startingString + "[Alex's Caves] may require some config changes in order to render Distant Horizons correctly.");
}
// William Wythers' Overhauled Overworld (WWOO)
if (modChecker.isModLoaded("wwoo"))
{
// WWOO has a bug with it's world gen that can't be fixed by DH or WWOO
// (at least that is what James learned after talking with WWOO)
// WWOO will cause grid lines to appear in the world when DH generates the chunks
// this might be due to how WWOO uses features for everything when generating
// and said features don't always get to the edge of said chunks.
String wwooWarning = "LODs generated by DH may have grid lines between sections. Disabling either WWOO or DH's distant generator will fix the problem.";
if (showChatWarnings)
{
String message =
// orange text
"\u00A76" + "Distant Horizons: WWOO detected." + "\u00A7r\n" +
wwooWarning;
ClientApi.INSTANCE.showChatMessageNextFrame(message);
}
LOGGER.warn(startingString + "[WWOO] "+ wwooWarning);
}
// Chunky
boolean chunkyPresent = false;
try
{
Class.forName("org.popcraft.chunky.api.ChunkyAPI");
chunkyPresent = true;
}
catch (ClassNotFoundException ignore) { }
if (chunkyPresent)
{
// Chunky can generate chunks faster than DH can process them,
// causing holes in the LODs.
// Generally it's better and faster to use DH's world generator.
String chunkyWarning = "Chunky can cause DH LODs to have holes " +
"since Chunky can generate chunks faster than DH can process them. \n" +
"Using DH's distant generator instead of chunky or increasing DH's CPU thread count can resolve the issue.";
if (showChatWarnings)
{
String message =
// orange text
"\u00A76" + "Distant Horizons: Chunky detected." + "\u00A7r\n" +
chunkyWarning;
ClientApi.INSTANCE.showChatMessageNextFrame(message);
}
LOGGER.warn(startingString + "[Chunky] "+ chunkyWarning);
}
}
//================//
// helper classes //
//================//
public interface IEventProxy
{
void registerEvents();
}
}
@@ -0,0 +1,112 @@
package com.seibel.distanthorizons.common;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.logging.ConfigBasedLogger;
import com.seibel.distanthorizons.core.network.event.internal.IncompatibleMessageInternalEvent;
import com.seibel.distanthorizons.core.network.event.internal.ProtocolErrorInternalEvent;
import com.seibel.distanthorizons.core.network.messages.MessageRegistry;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import com.seibel.distanthorizons.core.network.messages.base.CloseReasonMessage;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
import io.netty.buffer.ByteBufUtil;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import org.apache.logging.log4j.LogManager;
import java.io.IOException;
import java.util.Objects;
public abstract class AbstractPluginPacketSender implements IPluginPacketSender
{
private static final ConfigBasedLogger LOGGER = new ConfigBasedLogger(LogManager.getLogger(),
() -> Config.Common.Logging.logNetworkEvent.get());
#if MC_VER >= MC_1_21_1
public static final ResourceLocation WRAPPER_PACKET_RESOURCE = ResourceLocation.fromNamespaceAndPath(ModInfo.RESOURCE_NAMESPACE, ModInfo.WRAPPER_PACKET_PATH);
#else
public static final ResourceLocation WRAPPER_PACKET_RESOURCE = new ResourceLocation(ModInfo.RESOURCE_NAMESPACE, ModInfo.WRAPPER_PACKET_PATH);
#endif
@Override
public final void sendToClient(IServerPlayerWrapper serverPlayer, AbstractNetworkMessage message)
{
this.sendToClient((ServerPlayer) serverPlayer.getWrappedMcObject(), message);
}
public abstract void sendToClient(ServerPlayer serverPlayer, AbstractNetworkMessage message);
@Override
public abstract void sendToServer(AbstractNetworkMessage message);
public static AbstractNetworkMessage decodeMessage(FriendlyByteBuf in)
{
AbstractNetworkMessage message = null;
try
{
in.markReaderIndex();
int protocolVersion = in.readShort();
if (protocolVersion != ModInfo.PROTOCOL_VERSION)
{
return new IncompatibleMessageInternalEvent(protocolVersion);
}
message = MessageRegistry.INSTANCE.createMessage(in.readUnsignedShort());
message.decode(in);
if (in.isReadable())
{
throw new IOException("Buffer has not been fully read");
}
return message;
}
catch (Exception e)
{
in.resetReaderIndex();
LOGGER.error("Failed to decode message", e);
LOGGER.error("Buffer: ["+in+"]");
LOGGER.error("Buffer contents: ["+ByteBufUtil.hexDump(in)+"]");
return new ProtocolErrorInternalEvent(e, message, true);
}
finally
{
// Prevent connection crashing if not entire buffer has been read
in.readerIndex(in.writerIndex());
}
}
public static void encodeMessage(FriendlyByteBuf out, AbstractNetworkMessage message)
{
// This is intentionally unhandled, because errors related to this are unlikely to appear in wild
Objects.requireNonNull(message);
out.writeShort(ModInfo.PROTOCOL_VERSION);
try
{
out.markWriterIndex();
out.writeShort(MessageRegistry.INSTANCE.getMessageId(message));
message.encode(out);
}
catch (Exception e)
{
LOGGER.error("Failed to encode message", e);
LOGGER.error("Message: ["+message+"]");
message.getSession().tryHandleMessage(new ProtocolErrorInternalEvent(e, message, false));
// Encode close reason message instead
out.resetWriterIndex();
message = new CloseReasonMessage("Internal error on other side");
out.writeShort(MessageRegistry.INSTANCE.getMessageId(message));
message.encode(out);
}
}
}
@@ -0,0 +1,36 @@
package com.seibel.distanthorizons.common;
#if MC_VER >= MC_1_20_6
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public record CommonPacketPayload(@Nullable AbstractNetworkMessage message) implements CustomPacketPayload
{
public static final Type<CommonPacketPayload> TYPE = new Type<>(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE);
@NotNull
@Override
public Type<? extends CustomPacketPayload> type() { return TYPE; }
public static class Codec implements StreamCodec<FriendlyByteBuf, CommonPacketPayload>
{
@NotNull
@Override
public CommonPacketPayload decode(@NotNull FriendlyByteBuf in)
{ return new CommonPacketPayload(AbstractPluginPacketSender.decodeMessage(in)); }
@Override
public void encode(@NotNull FriendlyByteBuf out, CommonPacketPayload payload)
{ AbstractPluginPacketSender.encodeMessage(out, payload.message()); }
}
}
#endif
@@ -0,0 +1,102 @@
package com.seibel.distanthorizons.common.commands;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import net.minecraft.commands.CommandSourceStack;
#if MC_VER >= MC_1_19_2
import net.minecraft.network.chat.Component;
import java.util.Objects;
#else // < 1.19.2
import net.minecraft.network.chat.TranslatableComponent;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
#endif
/**
* Abstract class providing common functionality for DH's commands.
*/
public abstract class AbstractCommand
{
public abstract LiteralArgumentBuilder<CommandSourceStack> buildCommand();
/**
* Sends a success response to the player with the given text.
*
* @param commandContext The command context to send the response to.
* @param text The text to display in the success message.
* @return 1, indicating that the command was successful.
*/
protected int sendSuccessResponse(CommandContext<CommandSourceStack> commandContext, String text, boolean notifyAdmins)
{
#if MC_VER >= MC_1_20_1
commandContext.getSource().sendSuccess(() -> Component.literal(text), notifyAdmins);
#elif MC_VER >= MC_1_19_2
commandContext.getSource().sendSuccess(Component.literal(text), notifyAdmins);
#else
commandContext.getSource().sendSuccess(new TranslatableComponent(text), notifyAdmins);
#endif
return 1;
}
/**
* Sends a failure response to the player with the given text.
*
* @param commandContext The command context to send the response to.
* @param text The text to display in the failure message.
* @return 1, indicating that the command was successful.
*/
protected int sendFailureResponse(CommandContext<CommandSourceStack> commandContext, String text)
{
#if MC_VER >= MC_1_20_1
commandContext.getSource().sendFailure(Component.literal(text));
#elif MC_VER >= MC_1_19_2
commandContext.getSource().sendFailure(Component.literal(text));
#else
commandContext.getSource().sendFailure(new TranslatableComponent(text));
#endif
return 1;
}
/**
* Gets the server player from a command context.
*
* @param commandContext The command context to get the server player from.
* @return The server player wrapper for the player who sent the command.
*/
protected IServerPlayerWrapper getSourcePlayer(CommandContext<CommandSourceStack> commandContext) #if MC_VER < MC_1_19_2 throws CommandSyntaxException #endif
{
#if MC_VER >= MC_1_19_2
return ServerPlayerWrapper.getWrapper(Objects.requireNonNull(commandContext.getSource().getPlayer()));
#else
return ServerPlayerWrapper.getWrapper(commandContext.getSource().getPlayerOrException());
#endif
}
/**
* Checks if the source of a command is a player.
*
* @param source The source of the command to check.
* @return True if the source is a player, false otherwise.
*/
protected boolean isPlayerSource(CommandSourceStack source)
{
#if MC_VER >= MC_1_19_2
return source.isPlayer();
#else
try
{
source.getPlayerOrException();
return true;
}
catch (CommandSyntaxException e)
{
return false;
}
#endif
}
}
@@ -0,0 +1,49 @@
package com.seibel.distanthorizons.common.commands;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import net.minecraft.commands.CommandSourceStack;
import static com.seibel.distanthorizons.core.network.messages.MessageRegistry.DEBUG_CODEC_CRASH_MESSAGE;
import static net.minecraft.commands.Commands.literal;
/**
* Initializes commands of the mod.
*/
public class CommandInitializer
{
private final CommandDispatcher<CommandSourceStack> commandDispatcher;
/**
* Constructs a new instance of this class.
*
* @param commandDispatcher The dispatcher to use for registering commands.
*/
public CommandInitializer(CommandDispatcher<CommandSourceStack> commandDispatcher)
{
this.commandDispatcher = commandDispatcher;
}
/**
* Initializes all available commands.
*/
public void initCommands()
{
LiteralArgumentBuilder<CommandSourceStack> builder = literal("dh")
.requires(source -> source.hasPermission(4));
builder.then(new ConfigCommand().buildCommand());
builder.then(new DebugCommand().buildCommand());
builder.then(new PregenCommand().buildCommand());
if (DEBUG_CODEC_CRASH_MESSAGE)
{
builder.then(new CrashCommand().buildCommand());
}
this.commandDispatcher.register(builder);
}
}
@@ -0,0 +1,154 @@
package com.seibel.distanthorizons.common.commands;
import com.mojang.brigadier.arguments.*;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.seibel.distanthorizons.core.config.ConfigBase;
import com.seibel.distanthorizons.core.config.types.AbstractConfigType;
import com.seibel.distanthorizons.core.config.types.ConfigEntry;
import net.minecraft.commands.CommandSourceStack;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.function.ToIntBiFunction;
import static com.mojang.brigadier.arguments.DoubleArgumentType.doubleArg;
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
import static net.minecraft.commands.Commands.argument;
import static net.minecraft.commands.Commands.literal;
/**
* Command for managing config.
*/
public class ConfigCommand extends AbstractCommand
{
private static final List<CommandArgumentData<?>> commandArguments = Arrays.asList(
new CommandArgumentData<>(Integer.class, configEntry -> integer(configEntry.getMin(), configEntry.getMax()), IntegerArgumentType::getInteger),
new CommandArgumentData<>(Double.class, configEntry -> doubleArg(configEntry.getMin(), configEntry.getMax()), DoubleArgumentType::getDouble),
new CommandArgumentData<>(Boolean.class, BoolArgumentType::bool, BoolArgumentType::getBool),
new CommandArgumentData<>(String.class, StringArgumentType::string, StringArgumentType::getString)
);
/**
* Builds a command tree.
*/
@Override
@SuppressWarnings({"rawtypes", "unchecked"})
public LiteralArgumentBuilder<CommandSourceStack> buildCommand()
{
LiteralArgumentBuilder<CommandSourceStack> builder = literal("config");
HashSet<String> addedCommands = new HashSet<>();
for (AbstractConfigType<?, ?> type : ConfigBase.INSTANCE.entries)
{
// Skip non-config entries
if (!(type instanceof ConfigEntry))
{
continue;
}
//noinspection PatternVariableCanBeUsed
ConfigEntry configEntry = (ConfigEntry) type;
if (configEntry.getChatCommandName() == null)
{
continue;
}
if (!addedCommands.add(configEntry.getChatCommandName()))
{
throw new IllegalStateException("Duplicate command name: " + configEntry.getChatCommandName());
}
LiteralArgumentBuilder<CommandSourceStack> subcommand = literal(configEntry.getChatCommandName())
.executes(commandContext -> this.sendSuccessResponse(commandContext,
"\n" +
"Description of §l" + configEntry.getChatCommandName() + "§r:\n" +
"§o" + configEntry.getComment().trim() + "§r\n" +
"§7Config file name: §f" + configEntry.name + "§7, category: §f" + configEntry.category + "\n" +
"\n" +
"Current value of " + configEntry.getChatCommandName() + " is §n" + configEntry.get() + "§r",
false
));
ToIntBiFunction<CommandContext<CommandSourceStack>, Object> updateConfigValue = (commandContext, value) -> {
configEntry.set(value);
return this.sendSuccessResponse(commandContext, "Changed the value of [" + configEntry.getChatCommandName() + "] to [" + value + "]", true);
};
// Enum type needs a special case since enums aren't represented by existing argument type
// and need literals for each individual value
if (Enum.class.isAssignableFrom(configEntry.getType()))
{
for (Object choice : configEntry.getType().getEnumConstants())
{
subcommand.then(
literal(choice.toString())
.executes(c -> updateConfigValue.applyAsInt(c, choice))
);
}
}
else
{
boolean setterAdded = false;
for (CommandArgumentData<?> commandArgumentData : commandArguments)
{
if (!commandArgumentData.argumentClass.isAssignableFrom(configEntry.getType()))
{
continue;
}
subcommand.then(argument("value", commandArgumentData.getArgumentType(configEntry))
.executes(c -> updateConfigValue.applyAsInt(c, commandArgumentData.getValue(c, "value"))));
setterAdded = true;
break;
}
if (!setterAdded)
{
throw new RuntimeException("Config type of " + type.getName() + " is not supported: " + configEntry.getType().getSimpleName());
}
}
builder.then(subcommand);
}
return builder;
}
private static class CommandArgumentData<T>
{
public final Class<T> argumentClass;
public final Function<ConfigEntry<T>, ArgumentType<T>> argumentTypeFunction;
private final BiFunction<CommandContext<CommandSourceStack>, String, T> valueGetter;
public CommandArgumentData(Class<T> argumentClass, Supplier<ArgumentType<T>> argumentTypeSupplier, BiFunction<CommandContext<CommandSourceStack>, String, T> valueGetter)
{
this(argumentClass, configEntry -> argumentTypeSupplier.get(), valueGetter);
}
public CommandArgumentData(Class<T> argumentClass, Function<ConfigEntry<T>, ArgumentType<T>> argumentTypeFunction, BiFunction<CommandContext<CommandSourceStack>, String, T> valueGetter)
{
this.argumentClass = argumentClass;
this.argumentTypeFunction = argumentTypeFunction;
this.valueGetter = valueGetter;
}
public ArgumentType<T> getArgumentType(ConfigEntry<T> configEntry)
{
return this.argumentTypeFunction.apply(configEntry);
}
public T getValue(CommandContext<CommandSourceStack> commandContext, String argumentName)
{
return this.valueGetter.apply(commandContext, argumentName);
}
}
}
@@ -0,0 +1,44 @@
package com.seibel.distanthorizons.common.commands;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.seibel.distanthorizons.core.api.internal.SharedApi;
import com.seibel.distanthorizons.core.multiplayer.server.ServerPlayerState;
import com.seibel.distanthorizons.core.network.messages.base.CodecCrashMessage;
import net.minecraft.commands.CommandSourceStack;
import static net.minecraft.commands.Commands.literal;
public class CrashCommand extends AbstractCommand
{
@Override
public LiteralArgumentBuilder<CommandSourceStack> buildCommand()
{
return literal("crash")
.requires(this::isPlayerSource)
.then(literal("encode")
.executes(c -> {
assert SharedApi.getIDhServerWorld() != null;
ServerPlayerState serverPlayerState = SharedApi.getIDhServerWorld().getServerPlayerStateManager()
.getConnectedPlayer(this.getSourcePlayer(c));
if (serverPlayerState != null)
{
serverPlayerState.networkSession.sendMessage(new CodecCrashMessage(CodecCrashMessage.ECrashPhase.ENCODE));
}
return 1;
}))
.then(literal("decode")
.executes(c -> {
assert SharedApi.getIDhServerWorld() != null;
ServerPlayerState serverPlayerState = SharedApi.getIDhServerWorld().getServerPlayerStateManager()
.getConnectedPlayer(this.getSourcePlayer(c));
if (serverPlayerState != null)
{
serverPlayerState.networkSession.sendMessage(new CodecCrashMessage(CodecCrashMessage.ECrashPhase.DECODE));
}
return 1;
}));
}
}
@@ -0,0 +1,25 @@
package com.seibel.distanthorizons.common.commands;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.seibel.distanthorizons.core.logging.f3.F3Screen;
import net.minecraft.commands.CommandSourceStack;
import java.util.ArrayList;
import java.util.List;
import static net.minecraft.commands.Commands.literal;
public class DebugCommand extends AbstractCommand
{
@Override
public LiteralArgumentBuilder<CommandSourceStack> buildCommand()
{
return literal("debug")
.executes(c -> {
List<String> lines = new ArrayList<>();
F3Screen.addStringToDisplay(lines);
return this.sendSuccessResponse(c, String.join("\n", lines), false);
});
}
}
@@ -0,0 +1,107 @@
package com.seibel.distanthorizons.common.commands;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.generation.PregenManager;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos2D;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.arguments.DimensionArgument;
import net.minecraft.commands.arguments.coordinates.ColumnPosArgument;
import net.minecraft.server.level.ColumnPos;
import net.minecraft.server.level.ServerLevel;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture;
import static com.mojang.brigadier.arguments.IntegerArgumentType.getInteger;
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
import static net.minecraft.commands.Commands.argument;
import static net.minecraft.commands.Commands.literal;
public class PregenCommand extends AbstractCommand
{
private final PregenManager pregenManager = new PregenManager();
@Override
public LiteralArgumentBuilder<CommandSourceStack> buildCommand()
{
LiteralArgumentBuilder<CommandSourceStack> statusCommand = literal("status")
.executes(this::pregenStatus);
LiteralArgumentBuilder<CommandSourceStack> startCommand = literal("start")
.then(argument("dimension", DimensionArgument.dimension())
.then(argument("origin", ColumnPosArgument.columnPos())
.then(argument("chunkRadius", integer(32))
.executes(this::pregenStart))));
LiteralArgumentBuilder<CommandSourceStack> stopCommand = literal("stop")
.executes(this::pregenStop);
return literal("pregen")
.then(statusCommand)
.then(startCommand)
.then(stopCommand);
}
private int pregenStatus(CommandContext<CommandSourceStack> c)
{
String statusString = this.pregenManager.getStatusString();
//noinspection ReplaceNullCheck
if (statusString != null)
{
return this.sendSuccessResponse(c, statusString, false);
}
else
{
return this.sendSuccessResponse(c, "Pregen is not running", false);
}
}
private int pregenStart(CommandContext<CommandSourceStack> c) throws CommandSyntaxException
{
this.sendSuccessResponse(c, "Starting pregen. Progress will be in the server console.", true);
ServerLevel level = DimensionArgument.getDimension(c, "dimension");
ColumnPos origin = ColumnPosArgument.getColumnPos(c, "origin");
int chunkRadius = getInteger(c, "chunkRadius");
CompletableFuture<Void> future = this.pregenManager.startPregen(
ServerLevelWrapper.getWrapper(level),
new DhBlockPos2D(#if MC_VER >= MC_1_19_2 origin.x(), origin.z() #else origin.x, origin.z #endif),
chunkRadius
);
future.whenComplete((result, throwable) -> {
if (throwable instanceof CancellationException)
{
this.sendSuccessResponse(c, "Pregen is cancelled", true);
return;
}
else if (throwable != null)
{
this.sendFailureResponse(c, "Pregen failed: " + throwable.getMessage() + "\n Check the logs for more details.");
return;
}
this.sendSuccessResponse(c, "Pregen is complete", true);
});
return 1;
}
private int pregenStop(CommandContext<CommandSourceStack> c)
{
CompletableFuture<Void> runningPregen = this.pregenManager.getRunningPregen();
if (runningPregen == null)
{
return this.sendFailureResponse(c, "Pregen is not running");
}
runningPregen.cancel(true);
return 1;
}
}
@@ -0,0 +1,85 @@
package com.seibel.distanthorizons.common.commonMixins;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ServerApi;
import com.seibel.distanthorizons.core.api.internal.SharedApi;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.chunk.ChunkAccess;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
public class MixinChunkMapCommon
{
public static void onChunkSave(ServerLevel level, ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
{
// is this position already being updated?
if (SharedApi.isChunkAtChunkPosAlreadyUpdating(chunk.getPos().x, chunk.getPos().z))
{
return;
}
// is this chunk being saved to disk?
boolean savingChunkToDisk = ci.getReturnValue();
// true means a chunk was saved to disk
if (!savingChunkToDisk)
{
return;
}
// TODO are the following validations necessary since we are checking above if
// the callback return value should state if the chunk was actually saved or not?
// Do we trust it to always be correct?
// corrupt/incomplete chunk validation //
// MC has a tendency to try saving incomplete or corrupted chunks (which show up as empty or black chunks)
// this logic should prevent that from happening
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
if (chunk.isUnsaved() || chunk.getUpgradeData() != null || !chunk.isLightCorrect())
{
return;
}
#else
if (chunk.isUnsaved() || chunk.isUpgrading() || !chunk.isLightCorrect())
{
return;
}
#endif
// biome validation //
// some chunks may be missing their biomes, which cause issues when attempting to save them
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
if (chunk.getBiomes() == null)
{
return;
}
#else
try
{
// this will throw an exception if the biomes aren't set up
chunk.getNoiseBiome(0,0,0);
}
catch (Exception e)
{
return;
}
#endif
// submit the update event
ServerApi.INSTANCE.serverChunkSaveEvent(
new ChunkWrapper(chunk, ServerLevelWrapper.getWrapper(level)),
ServerLevelWrapper.getWrapper(level)
);
}
}
@@ -0,0 +1,32 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.util;
/**
* Added to MC's dynamic textures via mixins
* in order to denote whether a texture is a lightmap or not. <br><br>
*
* If not done any dynamic texture could be used as the lightmap
* which causes some weird rendering bugs.
*/
public interface ILightTextureMarker
{
void markLightTexture();
}
@@ -0,0 +1,47 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.util;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.LevelAccessor;
public class ProxyUtil
{
public static ILevelWrapper getLevelWrapper(LevelAccessor level)
{
ILevelWrapper levelWrapper;
if (level instanceof ServerLevel)
{
levelWrapper = ServerLevelWrapper.getWrapper((ServerLevel) level);
}
else
{
levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel) level);
}
return levelWrapper;
}
}
@@ -0,0 +1,78 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers;
import com.seibel.distanthorizons.common.wrappers.gui.ClassicConfigGUI;
import com.seibel.distanthorizons.common.wrappers.gui.LangWrapper;
import com.seibel.distanthorizons.common.wrappers.level.KeyedClientLevelManager;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftGLWrapper;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftServerWrapper;
import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager;
import com.seibel.distanthorizons.core.wrapperInterfaces.config.IConfigGui;
import com.seibel.distanthorizons.core.wrapperInterfaces.config.ILangWrapper;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants;
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
/**
* Binds all necessary dependencies, so we
* can access them in Core. <br>
* This needs to be called before any Core classes
* are loaded.
*
* @author James Seibel
* @author Ran
* @version 12-1-2021
*/
public class DependencySetup
{
public static void createSharedBindings()
{
SingletonInjector.INSTANCE.bind(ILangWrapper.class, LangWrapper.INSTANCE);
SingletonInjector.INSTANCE.bind(IVersionConstants.class, VersionConstants.INSTANCE);
SingletonInjector.INSTANCE.bind(IWrapperFactory.class, WrapperFactory.INSTANCE);
SingletonInjector.INSTANCE.bind(IKeyedClientLevelManager.class, KeyedClientLevelManager.INSTANCE);
DependencySetupDoneCheck.isDone = true;
}
//@Environment(EnvType.SERVER)
public static void createServerBindings()
{
SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftServerWrapper.INSTANCE);
}
//@Environment(EnvType.CLIENT)
public static void createClientBindings()
{
SingletonInjector.INSTANCE.bind(IMinecraftClientWrapper.class, MinecraftClientWrapper.INSTANCE);
SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftClientWrapper.INSTANCE);
SingletonInjector.INSTANCE.bind(IMinecraftRenderWrapper.class, MinecraftRenderWrapper.INSTANCE);
SingletonInjector.INSTANCE.bind(IMinecraftGLWrapper.class, MinecraftGLWrapper.INSTANCE);
SingletonInjector.INSTANCE.bind(IConfigGui.class, ClassicConfigGUI.CONFIG_CORE_INTERFACE);
}
}
@@ -0,0 +1,36 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers;
import java.util.function.Supplier;
public class DependencySetupDoneCheck
{
// TODO move to DependencySetup
public static boolean isDone = false;
/**
* This is used so we can override some MC logic when running
* in DH's world generator.
* Specifically so we can redirect threads to run on DH threads instead
* of MC threads.
*/
public static Supplier<Boolean> getIsCurrentThreadDistantGeneratorThread = (() -> { return false; });
}
@@ -0,0 +1,144 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers;
import java.nio.FloatBuffer;
import com.seibel.distanthorizons.core.enums.EDhDirection;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.util.math.Mat4f;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.ChunkPos;
/**
* This class converts to and from Minecraft objects (Ex: Matrix4f)
* and objects we created (Ex: Mat4f).
*
* @author James Seibel
* @version 11-20-2021
*/
public class McObjectConverter
{
private static int bufferIndex(int x, int y)
{
return y * 4 + x;
}
/** 4x4 float matrix converter */
@Deprecated
public static Mat4f Convert(
#if MC_VER < MC_1_19_4 com.mojang.math.Matrix4f
#else org.joml.Matrix4f #endif
mcMatrix)
{
FloatBuffer buffer = FloatBuffer.allocate(16);
storeMatrix(mcMatrix, buffer);
Mat4f matrix = new Mat4f(buffer);
#if MC_VER < MC_1_19_4
matrix.transpose(); // In 1.19.3 and later, we no longer need to transpose it
#endif
return matrix;
}
/** Taken from Minecraft's com.mojang.math.Matrix4f class from 1.18.2 */
private static void storeMatrix(
#if MC_VER < MC_1_19_4 com.mojang.math.Matrix4f
#else org.joml.Matrix4f #endif
matrix,
FloatBuffer buffer)
{
#if MC_VER < MC_1_19_4
matrix.store(buffer);
#else
// Mojang starts to use joml's Matrix4f libary in 1.19.3 so we copy their store method and use it here if its newer than 1.19.3
buffer.put(bufferIndex(0, 0), matrix.m00());
buffer.put(bufferIndex(0, 1), matrix.m01());
buffer.put(bufferIndex(0, 2), matrix.m02());
buffer.put(bufferIndex(0, 3), matrix.m03());
buffer.put(bufferIndex(1, 0), matrix.m10());
buffer.put(bufferIndex(1, 1), matrix.m11());
buffer.put(bufferIndex(1, 2), matrix.m12());
buffer.put(bufferIndex(1, 3), matrix.m13());
buffer.put(bufferIndex(2, 0), matrix.m20());
buffer.put(bufferIndex(2, 1), matrix.m21());
buffer.put(bufferIndex(2, 2), matrix.m22());
buffer.put(bufferIndex(2, 3), matrix.m23());
buffer.put(bufferIndex(3, 0), matrix.m30());
buffer.put(bufferIndex(3, 1), matrix.m31());
buffer.put(bufferIndex(3, 2), matrix.m32());
buffer.put(bufferIndex(3, 3), matrix.m33());
#endif
}
static final Direction[] directions;
static final EDhDirection[] lodDirections;
static
{
EDhDirection[] lodDirs = EDhDirection.values();
directions = new Direction[lodDirs.length];
lodDirections = new EDhDirection[lodDirs.length];
for (EDhDirection lodDir : lodDirs)
{
Direction dir;
switch (lodDir.name().toUpperCase())
{
case "DOWN":
dir = Direction.DOWN;
break;
case "UP":
dir = Direction.UP;
break;
case "NORTH":
dir = Direction.NORTH;
break;
case "SOUTH":
dir = Direction.SOUTH;
break;
case "WEST":
dir = Direction.WEST;
break;
case "EAST":
dir = Direction.EAST;
break;
default:
dir = null;
break;
}
if (dir == null)
{
throw new IllegalArgumentException("Invalid direction on init mapping: " + lodDir);
}
directions[lodDir.ordinal()] = dir;
lodDirections[dir.ordinal()] = lodDir;
}
}
public static BlockPos Convert(DhBlockPos wrappedPos) { return new BlockPos(wrappedPos.getX(), wrappedPos.getY(), wrappedPos.getZ()); }
public static ChunkPos Convert(DhChunkPos wrappedPos) { return new ChunkPos(wrappedPos.getX(), wrappedPos.getZ()); }
public static Direction Convert(EDhDirection lodDirection) { return directions[lodDirection.ordinal()]; }
public static EDhDirection Convert(Direction direction) { return lodDirections[direction.ordinal()]; }
}
@@ -0,0 +1,81 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers;
import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants;
/**
* @author James Seibel
* @version 12-11-2021
*/
public class VersionConstants implements IVersionConstants
{
public static final VersionConstants INSTANCE = new VersionConstants();
private VersionConstants()
{
}
@Override
public String getMinecraftVersion()
{
// these values are hard-coded to prevent an issue with Forge (specifically 1.18.2) where
// it can't load client classes when running as a dedicated server,
// which was how we were dynamically accessing the MC version string
#if MC_VER == MC_1_16_5
return "1.16.5";
#elif MC_VER == MC_1_17_1
return "1.17.1";
#elif MC_VER == MC_1_18_2
return "1.18.2";
#elif MC_VER == MC_1_19_2
return "1.19.2";
#elif MC_VER == MC_1_19_4
return "1.19.4";
#elif MC_VER == MC_1_20_1
return "1.20.1";
#elif MC_VER == MC_1_20_2
return "1.20.2";
#elif MC_VER == MC_1_20_4
return "1.20.4";
#elif MC_VER == MC_1_20_6
return "1.20.6";
#elif MC_VER == MC_1_21_1
return "1.21.1";
#elif MC_VER == MC_1_21_3
return "1.21.3";
#elif MC_VER == MC_1_21_4
return "1.21_4";
#else
ERROR MC version constant missing
#endif
}
}
@@ -0,0 +1,357 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers;
import com.seibel.distanthorizons.api.interfaces.block.IDhApiBiomeWrapper;
import com.seibel.distanthorizons.api.interfaces.block.IDhApiBlockStateWrapper;
import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper;
import com.seibel.distanthorizons.api.interfaces.factories.IDhApiWrapperFactory;
import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
import com.seibel.distanthorizons.core.level.IDhLevel;
import com.seibel.distanthorizons.core.level.IDhServerLevel;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.worldGeneration.AbstractBatchGenerationEnvironmentWrapper;
import net.minecraft.client.multiplayer.ClientLevel;
#if MC_VER > MC_1_17_1
import net.minecraft.core.Holder;
#endif
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess;
import java.io.IOException;
import java.util.HashSet;
/**
* This handles creating abstract wrapper objects.
*/
public class WrapperFactory implements IWrapperFactory
{
public static final WrapperFactory INSTANCE = new WrapperFactory();
//==============//
// core methods //
//==============//
@Override
public AbstractBatchGenerationEnvironmentWrapper createBatchGenerator(IDhLevel targetLevel)
{
if (targetLevel instanceof IDhServerLevel)
{
return new BatchGenerationEnvironment((IDhServerLevel) targetLevel);
}
else
{
throw new IllegalArgumentException("The target level must be a server-side level.");
}
}
@Override
public IDhApiBiomeWrapper getBiomeWrapper(String resourceLocationString, IDhApiLevelWrapper levelWrapper) throws IOException, ClassCastException
{
if (!(levelWrapper instanceof ILevelWrapper))
{
throw new ClassCastException("levelWrapper must be returned by DH and of type ["+ILevelWrapper.class.getName()+"].");
}
return BiomeWrapper.deserialize(resourceLocationString, (ILevelWrapper)levelWrapper);
}
@Override
public IDhApiBlockStateWrapper getDefaultBlockStateWrapper(String resourceLocationString, IDhApiLevelWrapper levelWrapper) throws IOException, ClassCastException
{
if (!(levelWrapper instanceof ILevelWrapper))
{
throw new ClassCastException("Invalid ["+IDhApiLevelWrapper.class.getSimpleName()+"] value given. Level wrapper object must be one given by the DH API (it can't be a custom implementation), specifically of type ["+ILevelWrapper.class.getName()+"].");
}
return BlockStateWrapper.deserialize(resourceLocationString, (ILevelWrapper)levelWrapper);
}
@Override
public IBiomeWrapper deserializeBiomeWrapper(String str, ILevelWrapper levelWrapper) throws IOException { return BiomeWrapper.deserialize(str, levelWrapper); }
@Override
public IBiomeWrapper getPlainsBiomeWrapper(ILevelWrapper levelWrapper) // TODO is there a way we could get this without the levelWrapper? it isn't necessary but would clean up the code a bit
{
try
{
return BiomeWrapper.deserialize(BiomeWrapper.PLAINS_RESOURCE_LOCATION_STRING, levelWrapper);
}
catch (IOException e)
{
throw new LodUtil.AssertFailureException("Unable to parse plains resource string ["+BiomeWrapper.PLAINS_RESOURCE_LOCATION_STRING+"], error:\n " + e.getMessage());
}
}
@Override
public IBlockStateWrapper deserializeBlockStateWrapper(String str, ILevelWrapper levelWrapper) throws IOException { return BlockStateWrapper.deserialize(str, levelWrapper); }
@Override
public IBlockStateWrapper getAirBlockStateWrapper() { return BlockStateWrapper.AIR; }
@Override
public HashSet<IBlockStateWrapper> getRendererIgnoredBlocks(ILevelWrapper levelWrapper) { return BlockStateWrapper.getRendererIgnoredBlocks(levelWrapper); }
@Override
public HashSet<IBlockStateWrapper> getRendererIgnoredCaveBlocks(ILevelWrapper levelWrapper) { return BlockStateWrapper.getRendererIgnoredCaveBlocks(levelWrapper); }
@Override
public void resetRendererIgnoredCaveBlocks() { BlockStateWrapper.clearRendererIgnoredCaveBlocks(); }
@Override
public void resetRendererIgnoredBlocksSet() { BlockStateWrapper.clearRendererIgnoredBlocks(); }
/**
* Note: when this is updated for different MC versions, make sure you also update the documentation in
* {@link IDhApiWorldGenerator#generateChunks} and the type list in {@link WrapperFactory#createChunkWrapperErrorMessage}. <br><br>
*
* For full method documentation please see: {@link IWrapperFactory#createChunkWrapper}
*
* @see IWrapperFactory#createChunkWrapper
*/
public IChunkWrapper createChunkWrapper(Object[] objectArray) throws ClassCastException
{
if (objectArray.length == 1 && objectArray[0] instanceof IChunkWrapper)
{
try
{
// this path should only happen when called by Distant Horizons code
// API implementors should never hit this path
return (IChunkWrapper) objectArray[0];
}
catch (Exception e)
{
throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
}
}
//#if MC_VER <= MC_1_XX_X
else if (objectArray.length == 2)
{
// correct number of parameters from the API
// chunk
if (!(objectArray[0] instanceof ChunkAccess))
{
throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
}
ChunkAccess chunk = (ChunkAccess) objectArray[0];
// level / light source
if (!(objectArray[1] instanceof Level))
{
throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
}
// the level is needed for the DH level wrapper...
Level level = (Level) objectArray[1];
// level wrapper
ILevelWrapper levelWrapper = level.isClientSide()
? ClientLevelWrapper.getWrapper((ClientLevel)level)
: ServerLevelWrapper.getWrapper((ServerLevel)level);
return new ChunkWrapper(chunk, levelWrapper);
}
// incorrect number of parameters from the API
else
{
throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
}
//#endif
}
/**
* Note: when this is updated for different MC versions,
* make sure you also update the documentation in {@link IDhApiWorldGenerator#generateChunks}.
*/
private static String createChunkWrapperErrorMessage(Object[] objectArray)
{
String[] expectedClassNames;
//#if MC_VER <= MC_1_XX_X
expectedClassNames = new String[]
{
ChunkAccess.class.getName(),
"[ServerLevel] or [ClientLevel]" // Classes are not referenced by names to avoid exception when one of them is missing
};
//#endif
return createWrapperErrorMessage("Chunk wrapper", expectedClassNames, objectArray);
}
//=============//
// api methods //
//=============//
// documentation should be in the API interface
public IDhApiBiomeWrapper getBiomeWrapper(Object[] objectArray, IDhApiLevelWrapper levelWrapper)
{
// confirm the API level wrapper is also a Core wrapper
if (!(levelWrapper instanceof ILevelWrapper))
{
throw new ClassCastException("Invalid ["+IDhApiLevelWrapper.class.getSimpleName()+"] value given. Level wrapper object must be one given by the DH API (it can't be a custom implementation), specifically of type ["+ILevelWrapper.class.getName()+"].");
}
ILevelWrapper coreLevelWrapper = (ILevelWrapper) levelWrapper;
#if MC_VER < MC_1_20_4
if (objectArray.length != 1)
{
throw new ClassCastException(createBiomeWrapperErrorMessage(objectArray));
}
#endif
#if MC_VER < MC_1_18_2
if (!(objectArray[0] instanceof Biome))
{
throw new ClassCastException(createBiomeWrapperErrorMessage(objectArray));
}
Biome biome = (Biome) objectArray[0];
return BiomeWrapper.getBiomeWrapper(biome, coreLevelWrapper);
#else
if (!(objectArray[0] instanceof Holder) || !(((Holder<?>) objectArray[0]).value() instanceof Biome))
{
throw new ClassCastException(createBiomeWrapperErrorMessage(objectArray));
}
Holder<Biome> biomeHolder = (Holder<Biome>) objectArray[0];
return BiomeWrapper.getBiomeWrapper(biomeHolder, coreLevelWrapper);
#endif
}
/**
* Note: when this is updated for different MC versions,
* make sure you also update the documentation in {@link IDhApiWrapperFactory#getBiomeWrapper}.
*/
private static String createBiomeWrapperErrorMessage(Object[] objectArray)
{
String[] expectedClassNames;
#if MC_VER < MC_1_18_2
expectedClassNames = new String[] { Biome.class.getName() };
#else
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
#endif
return createWrapperErrorMessage("Biome wrapper", expectedClassNames, objectArray);
}
public IDhApiBlockStateWrapper getBlockStateWrapper(Object[] objectArray, IDhApiLevelWrapper levelWrapper)
{
// confirm the API level wrapper is also a Core wrapper
if (!(levelWrapper instanceof ILevelWrapper))
{
throw new ClassCastException("Invalid ["+IDhApiLevelWrapper.class.getSimpleName()+"] value given. Level wrapper object must be one given by the DH API (it can't be a custom implementation), specifically of type ["+ILevelWrapper.class.getName()+"].");
}
ILevelWrapper coreLevelWrapper = (ILevelWrapper) levelWrapper;
//#if MC_VER <= MC_1_XX_X
if (objectArray.length != 1)
{
throw new ClassCastException(createBlockStateWrapperErrorMessage(objectArray));
}
if (!(objectArray[0] instanceof BlockState))
{
throw new ClassCastException(createBlockStateWrapperErrorMessage(objectArray));
}
BlockState blockState = (BlockState) objectArray[0];
return BlockStateWrapper.fromBlockState(blockState, coreLevelWrapper);
//#endif
}
/**
* Note: when this is updated for different MC versions,
* make sure you also update the documentation in {@link IDhApiWrapperFactory#getBlockStateWrapper}.
*/
private static String createBlockStateWrapperErrorMessage(Object[] objectArray)
{
String[] expectedClassNames;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
expectedClassNames = new String[] { Biome.class.getName() };
#else
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
#endif
return createWrapperErrorMessage("BlockState wrapper", expectedClassNames, objectArray);
}
//================//
// helper methods //
//================//
private static String createWrapperErrorMessage(String wrapperName, String[] expectedClassNames, Object[] objectArray)
{
// error header
StringBuilder message = new StringBuilder(
wrapperName + " creation failed. \n" +
"Expected object array parameters: \n");
// expected parameters
for (String expectedClassName : expectedClassNames)
{
message.append("[").append(expectedClassName).append("], \n");
}
// given parameters
if (objectArray.length != 0)
{
message.append("Given parameters: ");
for (Object obj : objectArray)
{
String objClassName = (obj != null) ? obj.getClass().getName() : "NULL";
message.append("[").append(objClassName).append("], ");
}
}
else
{
message.append(" No parameters given.");
}
return message.toString();
}
}
@@ -0,0 +1,371 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.block;
import java.io.IOException;
import java.util.HashSet;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import net.minecraft.world.level.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
import net.minecraft.core.Registry;
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.data.BuiltinRegistries;
#else
import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
#endif
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biome;
#if MC_VER >= MC_1_18_2
import net.minecraft.world.level.biome.Biomes;
#endif
/** This class wraps the minecraft BlockPos.Mutable (and BlockPos) class */
public class BiomeWrapper implements IBiomeWrapper
{
// must be defined before AIR, otherwise a null pointer will be thrown
private static final Logger LOGGER = LogManager.getLogger();
#if MC_VER < MC_1_18_2
public static final ConcurrentMap<Biome, BiomeWrapper> WRAPPER_BY_BIOME = new ConcurrentHashMap<>();
#else
public static final ConcurrentMap<Holder<Biome>, BiomeWrapper> WRAPPER_BY_BIOME = new ConcurrentHashMap<>();
#endif
public static final ConcurrentHashMap<String, BiomeWrapper> WRAPPER_BY_RESOURCE_LOCATION = new ConcurrentHashMap<>();
public static final String EMPTY_BIOME_STRING = "EMPTY";
public static final BiomeWrapper EMPTY_WRAPPER = new BiomeWrapper(null, null);
public static final String PLAINS_RESOURCE_LOCATION_STRING = "minecraft:plains";
/** keep track of broken biomes so we don't log every time */
private static final HashSet<String> brokenResourceLocationStrings = new HashSet<>();
/**
* Only display this warning once, otherwise the log may be spammed <br>
* This is a known issue when joining Hypixel.
*/
private static boolean emptyStringWarningLogged = false;
private static boolean emptyLevelSerializeFailLogged = false;
// properties //
#if MC_VER < MC_1_18_2
public final Biome biome;
#else
public final Holder<Biome> biome;
#endif
/** technically final, but since it requires a method call to generate it can't be marked as such */
private String serialString;
private final int hashCode;
//==============//
// constructors //
//==============//
static public IBiomeWrapper getBiomeWrapper(#if MC_VER < MC_1_18_2 Biome #else Holder<Biome> #endif biome, ILevelWrapper levelWrapper)
{
if (biome == null)
{
return EMPTY_WRAPPER;
}
if (WRAPPER_BY_BIOME.containsKey(biome))
{
return WRAPPER_BY_BIOME.get(biome);
}
else
{
BiomeWrapper newWrapper = new BiomeWrapper(biome, levelWrapper);
WRAPPER_BY_BIOME.put(biome, newWrapper);
return newWrapper;
}
}
private BiomeWrapper(#if MC_VER < MC_1_18_2 Biome #else Holder<Biome> #endif biome, ILevelWrapper levelWrapper)
{
this.biome = biome;
this.serialString = this.serialize(levelWrapper);
this.hashCode = Objects.hash(this.serialString);
//LOGGER.trace("Created BiomeWrapper ["+this.serialString+"] for ["+biome+"]");
}
/** should only be used to create {@link BiomeWrapper#EMPTY_WRAPPER} */
private BiomeWrapper()
{
this.biome = null;
this.serialString = EMPTY_BIOME_STRING;
this.hashCode = Objects.hash(this.serialString);
}
//=========//
// methods //
//=========//
@Override
public String getName()
{
if (this == EMPTY_WRAPPER)
{
return EMPTY_BIOME_STRING;
}
#if MC_VER < MC_1_18_2
return biome.toString();
#else
return this.biome.unwrapKey().orElse(Biomes.THE_VOID).registry().toString();
#endif
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
else if (obj == null || this.getClass() != obj.getClass())
{
return false;
}
BiomeWrapper that = (BiomeWrapper) obj;
// the serialized value is used so we can test the contents instead of the references
return Objects.equals(this.getSerialString(), that.getSerialString());
}
@Override
public int hashCode() { return this.hashCode; }
@Override
public String getSerialString() { return this.serialString; }
@Override
public Object getWrappedMcObject() { return this.biome; }
@Override
public String toString() { return this.getSerialString(); }
//=======================//
// serialization methods //
//=======================//
public String serialize(ILevelWrapper levelWrapper)
{
if (this.biome == null)
{
return EMPTY_BIOME_STRING;
}
// we can't generate a serial string if the level is null
if (levelWrapper == null)
{
if (!emptyLevelSerializeFailLogged)
{
emptyLevelSerializeFailLogged = true;
LOGGER.warn("Unable to serialize biome: [" + this.biome + "] because the passed in level wrapper is null. Future errors of this type won't be logged.");
}
return EMPTY_BIOME_STRING;
}
// generate the serial string //
Level level = (Level)levelWrapper.getWrappedMcObject();
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
ResourceLocation resourceLocation;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
resourceLocation = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).getKey(this.biome);
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
resourceLocation = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).getKey(this.biome.value());
#elif MC_VER < MC_1_21_3
resourceLocation = registryAccess.registryOrThrow(Registries.BIOME).getKey(this.biome.value());
#else
resourceLocation = registryAccess.lookupOrThrow(Registries.BIOME).getKey(this.biome.value());
#endif
if (resourceLocation == null)
{
String biomeName;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
biomeName = this.biome.toString();
#else
biomeName = this.biome.value().toString();
#endif
LOGGER.warn("unable to serialize: " + biomeName);
// shouldn't normally happen, but just in case
this.serialString = "";
}
else
{
this.serialString = resourceLocation.getNamespace() + ":" + resourceLocation.getPath();
}
return this.serialString;
}
// TODO would it be worth while to cache these objects in a ConcurrentHashMap<string, IBiomeWrapper>?
public static IBiomeWrapper deserialize(String resourceLocationString, ILevelWrapper levelWrapper) throws IOException
{
// we need the final string for the concurrent hash map later
final String finalResourceStateString = resourceLocationString;
if (resourceLocationString.equals(EMPTY_BIOME_STRING))
{
if (!emptyStringWarningLogged)
{
emptyStringWarningLogged = true;
LOGGER.warn("[" + EMPTY_BIOME_STRING + "] biome string deserialized. This may mean the level was null when a save was attempted, a file saving error, or a biome saving error. Future errors will not be logged.");
}
return EMPTY_WRAPPER;
}
else if (resourceLocationString.trim().isEmpty() || resourceLocationString.equals(""))
{
LOGGER.warn("Null biome string deserialized.");
return EMPTY_WRAPPER;
}
if (WRAPPER_BY_RESOURCE_LOCATION.containsKey(finalResourceStateString))
{
return WRAPPER_BY_RESOURCE_LOCATION.get(finalResourceStateString);
}
// if no wrapper is found, default to the empty wrapper
BiomeWrapper foundWrapper = EMPTY_WRAPPER;
try
{
// parse the resource location
int separatorIndex = resourceLocationString.indexOf(":");
if (separatorIndex == -1)
{
throw new IOException("Unable to parse resource location string: [" + resourceLocationString + "].");
}
ResourceLocation resourceLocation;
try
{
#if MC_VER < MC_1_21_1
resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
#else
resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
#endif
}
catch (Exception e)
{
throw new IOException("No Resource Location found for the string: [" + resourceLocationString + "] Error: [" + e.getMessage() + "].");
}
try
{
Level level = (Level) levelWrapper.getWrappedMcObject();
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
boolean success;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
Biome biome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
success = (biome != null);
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
success = (unwrappedBiome != null);
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
#elif MC_VER < MC_1_21_3
Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation);
success = (unwrappedBiome != null);
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
#else
Holder<Biome> biome;
Optional<Holder.Reference<Biome>> optionalBiomeHolder = registryAccess.lookupOrThrow(Registries.BIOME).get(resourceLocation);
if (optionalBiomeHolder.isPresent())
{
Biome unwrappedBiome = optionalBiomeHolder.get().value();
success = (unwrappedBiome != null);
biome = new Holder.Direct<>(unwrappedBiome);
}
else
{
success = false;
biome = null;
}
#endif
if (!success)
{
if (!brokenResourceLocationStrings.contains(resourceLocationString))
{
brokenResourceLocationStrings.add(resourceLocationString);
LOGGER.warn("Unable to deserialize biome from string: [" + resourceLocationString + "]");
}
return EMPTY_WRAPPER;
}
foundWrapper = (BiomeWrapper) getBiomeWrapper(biome, levelWrapper);
return foundWrapper;
}
catch (Exception e)
{
throw new IOException("Failed to deserialize the string [" + finalResourceStateString + "] into a BiomeWrapper: " + e.getMessage(), e);
}
}
finally
{
WRAPPER_BY_RESOURCE_LOCATION.putIfAbsent(finalResourceStateString, foundWrapper);
}
}
}
@@ -0,0 +1,816 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.block;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiBlockMaterial;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.config.types.ConfigEntry;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.util.ColorUtil;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.level.block.BeaconBeamBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import org.apache.logging.log4j.Logger;
import java.awt.*;
import java.io.IOException;
import java.util.*;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.jetbrains.annotations.Nullable;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
import net.minecraft.core.Registry;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.EmptyBlockGetter;
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
import net.minecraft.client.Minecraft;
import net.minecraft.world.level.Level;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry;
import net.minecraft.world.level.EmptyBlockGetter;
#else
import net.minecraft.world.level.Level;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.level.EmptyBlockGetter;
import net.minecraft.core.Holder;
#endif
public class BlockStateWrapper implements IBlockStateWrapper
{
/** example "minecraft:water" */
public static final String RESOURCE_LOCATION_SEPARATOR = ":";
/** example "minecraft:water_STATE_{level:0}" */
public static final String STATE_STRING_SEPARATOR = "_STATE_";
// must be defined before AIR, otherwise a null pointer will be thrown
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
public static final ConcurrentHashMap<BlockState, BlockStateWrapper> WRAPPER_BY_BLOCK_STATE = new ConcurrentHashMap<>();
public static final ConcurrentHashMap<String, BlockStateWrapper> WRAPPER_BY_RESOURCE_LOCATION = new ConcurrentHashMap<>();
public static final String AIR_STRING = "AIR";
public static final BlockStateWrapper AIR = new BlockStateWrapper(null, null);
public static final String DIRT_RESOURCE_LOCATION_STRING = "minecraft:dirt";
public static HashSet<IBlockStateWrapper> rendererIgnoredBlocks = null;
public static HashSet<IBlockStateWrapper> rendererIgnoredCaveBlocks = null;
/** keep track of broken blocks so we don't log every time */
private static final HashSet<ResourceLocation> BROKEN_RESOURCE_LOCATIONS = new HashSet<>();
// properties //
@Nullable
public final BlockState blockState;
/** technically final, but since it requires a method call to generate it can't be marked as such */
private String serialString;
private final int hashCode;
/**
* Cached opacity value, -1 if not populated. <br>
* Should be between {@link LodUtil#BLOCK_FULLY_OPAQUE} and {@link LodUtil#BLOCK_FULLY_OPAQUE}
*/
private int opacity = -1;
/** used by the Iris shader mod to determine how each LOD should be rendered */
private byte blockMaterialId = 0;
private final boolean isBeaconBlock;
private final boolean isBeaconBaseBlock;
/** null if this block can't tint beacons */
private final Color beaconTintColor;
private final Color mapColor;
//==============//
// constructors //
//==============//
public static BlockStateWrapper fromBlockState(BlockState blockState, ILevelWrapper levelWrapper)
{
if (blockState == null || blockState.isAir())
{
return AIR;
}
if (WRAPPER_BY_BLOCK_STATE.containsKey(blockState))
{
return WRAPPER_BY_BLOCK_STATE.get(blockState);
}
else
{
BlockStateWrapper newWrapper = new BlockStateWrapper(blockState, levelWrapper);
WRAPPER_BY_BLOCK_STATE.put(blockState, newWrapper);
return newWrapper;
}
}
/**
* Can be faster than {@link BlockStateWrapper#fromBlockState(BlockState, ILevelWrapper)}
* in cases where the same block state is expected to be referenced multiple times.
*/
public static BlockStateWrapper fromBlockState(BlockState blockState, ILevelWrapper levelWrapper, IBlockStateWrapper guess)
{
BlockState guessBlockState = (guess == null || guess.isAir()) ? null : (BlockState) guess.getWrappedMcObject();
BlockState inputBlockState = (blockState == null || blockState.isAir()) ? null : blockState;
if (guess instanceof BlockStateWrapper
&& guessBlockState == inputBlockState)
{
return (BlockStateWrapper) guess;
}
else
{
return fromBlockState(blockState, levelWrapper);
}
}
private BlockStateWrapper(BlockState blockState, ILevelWrapper levelWrapper)
{
this.blockState = blockState;
this.serialString = this.serialize(levelWrapper);
this.hashCode = Objects.hash(this.serialString);
this.blockMaterialId = this.calculateEDhApiBlockMaterialId().index;
// beacon blocks
String lowercaseSerial = this.serialString.toLowerCase();
boolean isBeaconBaseBlock = false;
for (int i = 0; i < LodUtil.BEACON_BASE_BLOCK_NAME_LIST.size(); i++)
{
String baseBlockName = LodUtil.BEACON_BASE_BLOCK_NAME_LIST.get(i);
if (lowercaseSerial.contains(baseBlockName))
{
isBeaconBaseBlock = true;
break;
}
}
this.isBeaconBaseBlock = isBeaconBaseBlock;
this.isBeaconBlock = lowercaseSerial.contains("minecraft:beacon");
// beacon tint color
Color beaconTintColor = null;
if (this.blockState != null
// beacon blocks also show up here, but since they block the beacon beam we don't want their color
&& !this.isBeaconBlock)
{
Block block = this.blockState.getBlock();
if (block instanceof BeaconBeamBlock)
{
int colorInt;
#if MC_VER <= MC_1_19_4
colorInt = ((BeaconBeamBlock) block).getColor().getMaterialColor().col;
#else
colorInt = ((BeaconBeamBlock) block).getColor().getMapColor().col;
#endif
beaconTintColor = ColorUtil.toColorObjRGB(colorInt);
}
}
this.beaconTintColor = beaconTintColor;
int mcColor = 0;
if (this.blockState != null)
{
#if MC_VER < MC_1_20_1
mcColor = this.blockState.getMaterial().getColor().col;
#else
mcColor = this.blockState.getMapColor(EmptyBlockGetter.INSTANCE, BlockPos.ZERO).col;
#endif
this.mapColor = ColorUtil.toColorObjRGB(mcColor);
}
else
{
this.mapColor = new Color(0,0,0,0);
}
//LOGGER.trace("Created BlockStateWrapper ["+this.serialString+"] for ["+blockState+"] with material ID ["+this.EDhApiBlockMaterialId+"]");
}
//====================//
// LodBuilder methods //
//====================//
/**
* Requires a {@link ILevelWrapper} since {@link BlockStateWrapper#deserialize(String,ILevelWrapper)} also requires one.
* This way the method won't accidentally be called before the deserialization can be completed.
*/
public static HashSet<IBlockStateWrapper> getRendererIgnoredBlocks(ILevelWrapper levelWrapper)
{
// use the cached version if possible
if (rendererIgnoredBlocks != null)
{
return rendererIgnoredBlocks;
}
HashSet<String> baseIgnoredBlock = new HashSet<>();
baseIgnoredBlock.add(AIR_STRING);
rendererIgnoredBlocks = getBlockWrappers(Config.Client.Advanced.Graphics.Culling.ignoredRenderBlockCsv, baseIgnoredBlock, levelWrapper);
return rendererIgnoredBlocks;
}
/**
* Requires a {@link ILevelWrapper} since {@link BlockStateWrapper#deserialize(String,ILevelWrapper)} also requires one.
* This way the method won't accidentally be called before the deserialization can be completed.
*/
public static HashSet<IBlockStateWrapper> getRendererIgnoredCaveBlocks(ILevelWrapper levelWrapper)
{
// use the cached version if possible
if (rendererIgnoredCaveBlocks != null)
{
return rendererIgnoredCaveBlocks;
}
HashSet<String> baseIgnoredBlock = new HashSet<>();
baseIgnoredBlock.add(AIR_STRING);
rendererIgnoredCaveBlocks = getBlockWrappers(Config.Client.Advanced.Graphics.Culling.ignoredRenderCaveBlockCsv, baseIgnoredBlock, levelWrapper);
return rendererIgnoredCaveBlocks;
}
public static void clearRendererIgnoredBlocks() { rendererIgnoredBlocks = null; }
public static void clearRendererIgnoredCaveBlocks() { rendererIgnoredCaveBlocks = null; }
// lod builder helpers //
private static HashSet<IBlockStateWrapper> getBlockWrappers(ConfigEntry<String> config, HashSet<String> baseResourceLocations, ILevelWrapper levelWrapper)
{
// get the base blocks
HashSet<String> blockStringList = new HashSet<>();
if (baseResourceLocations != null)
{
blockStringList.addAll(baseResourceLocations);
}
// get the config blocks
String ignoreBlockCsv = config.get();
if (ignoreBlockCsv != null)
{
blockStringList.addAll(Arrays.asList(ignoreBlockCsv.split(",")));
}
return getBlockWrappers(blockStringList, levelWrapper);
}
private static HashSet<IBlockStateWrapper> getBlockWrappers(HashSet<String> blockResourceLocationSet, ILevelWrapper levelWrapper)
{
// deserialize each of the given resource locations
HashSet<IBlockStateWrapper> blockStateWrappers = new HashSet<>();
for (String blockResourceLocation : blockResourceLocationSet)
{
try
{
if (blockResourceLocation == null)
{
// shouldn't happen, but just in case
continue;
}
String cleanedResourceLocation = blockResourceLocation.trim();
if (cleanedResourceLocation.length() == 0)
{
continue;
}
BlockStateWrapper defaultBlockStateToIgnore = (BlockStateWrapper) deserialize(cleanedResourceLocation, levelWrapper);
blockStateWrappers.add(defaultBlockStateToIgnore);
if (defaultBlockStateToIgnore != AIR)
{
// add all possible blockstates (to account for light blocks with different light values and such)
List<BlockState> blockStatesToIgnore = defaultBlockStateToIgnore.blockState.getBlock().getStateDefinition().getPossibleStates();
for (BlockState blockState : blockStatesToIgnore)
{
BlockStateWrapper newBlockToIgnore = BlockStateWrapper.fromBlockState(blockState, levelWrapper);
blockStateWrappers.add(newBlockToIgnore);
}
}
else
{
// air is a special case so it must be handled separately
blockStateWrappers.add(AIR);
}
}
catch (IOException e)
{
LOGGER.warn("Unable to deserialize block with the resource location: ["+blockResourceLocation+"]. Error: "+e.getMessage(), e);
}
catch (Exception e)
{
LOGGER.warn("Unexpected error deserializing block with the resource location: ["+blockResourceLocation+"]. Error: "+e.getMessage(), e);
}
}
return blockStateWrappers;
}
//=================//
// wrapper methods //
//=================//
@Override
public int getOpacity()
{
// use the cached opacity value if possible
if (this.opacity != -1)
{
return this.opacity;
}
// get block properties (default to the values used by air)
boolean canOcclude = false;
boolean propagatesSkyLightDown = true;
if (this.blockState != null)
{
canOcclude = this.blockState.canOcclude();
#if MC_VER < MC_1_21_3
propagatesSkyLightDown = this.blockState.propagatesSkylightDown(EmptyBlockGetter.INSTANCE, BlockPos.ZERO);
#else
propagatesSkyLightDown = this.blockState.propagatesSkylightDown();
#endif
}
// this method isn't perfect, but works well enough for our use case
int opacity;
if (this.isAir())
{
opacity = LodUtil.BLOCK_FULLY_TRANSPARENT;
}
else if (this.isLiquid() && !canOcclude)
{
// probably not a waterlogged block (which should block light entirely)
// +1 to indicate that the block is translucent (in between transparent and opaque)
opacity = LodUtil.BLOCK_FULLY_TRANSPARENT + 1;
}
else if (propagatesSkyLightDown && !canOcclude)
{
// probably glass or some other fully transparent block
// !canOcclude is required to ignore stairs and slabs since
// propagateSkyLightDown is true for them, but they're solid and don't actually let light through
opacity = LodUtil.BLOCK_FULLY_TRANSPARENT;
}
else
{
// default for all other blocks
opacity = LodUtil.BLOCK_FULLY_OPAQUE;
}
this.opacity = opacity;
return this.opacity;
}
@Override
public int getLightEmission() { return (this.blockState != null) ? this.blockState.getLightEmission() : 0; }
@Override
public String getSerialString() { return this.serialString; }
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null || this.getClass() != obj.getClass())
{
return false;
}
BlockStateWrapper that = (BlockStateWrapper) obj;
// the serialized value is used so we can test the contents instead of the references
return Objects.equals(this.getSerialString(), that.getSerialString());
}
@Override
public int hashCode() { return this.hashCode; }
@Override
public Object getWrappedMcObject() { return this.blockState; }
@Override
public boolean isAir() { return this.isAir(this.blockState); }
public boolean isAir(BlockState blockState) { return blockState == null || blockState.isAir(); }
@Override
public boolean isSolid()
{
if (this.isAir())
{
return false;
}
#if MC_VER < MC_1_20_1
return this.blockState.getMaterial().isSolid();
#else
return !this.blockState.getCollisionShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO).isEmpty();
#endif
}
@Override
public boolean isLiquid()
{
if (this.isAir())
{
return false;
}
#if MC_VER < MC_1_20_1
return this.blockState.getMaterial().isLiquid() || !this.blockState.getFluidState().isEmpty();
#else
return !this.blockState.getFluidState().isEmpty();
#endif
}
@Override
public boolean isBeaconBlock() { return this.isBeaconBlock; }
@Override
public boolean isBeaconBaseBlock() { return this.isBeaconBaseBlock; }
@Override
public boolean isBeaconTintBlock() { return this.beaconTintColor != null; }
@Override
public Color getMapColor() { return this.mapColor; }
@Override
public Color getBeaconTintColor() { return this.beaconTintColor; }
@Override
public byte getMaterialId() { return this.blockMaterialId; }
@Override
public String toString() { return this.getSerialString(); }
//=======================//
// serialization methods //
//=======================//
private String serialize(ILevelWrapper levelWrapper)
{
if (this.blockState == null)
{
return AIR_STRING;
}
// older versions of MC have a static registry
#if MC_VER > MC_1_17_1
Level level = (Level)levelWrapper.getWrappedMcObject();
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
#endif
ResourceLocation resourceLocation;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
resourceLocation = Registry.BLOCK.getKey(this.blockState.getBlock());
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
resourceLocation = registryAccess.registryOrThrow(Registry.BLOCK_REGISTRY).getKey(this.blockState.getBlock());
#elif MC_VER < MC_1_21_3
resourceLocation = registryAccess.registryOrThrow(Registries.BLOCK).getKey(this.blockState.getBlock());
#else
resourceLocation = registryAccess.lookupOrThrow(Registries.BLOCK).getKey(this.blockState.getBlock());
#endif
if (resourceLocation == null)
{
LOGGER.warn("No ResourceLocation found, unable to serialize: " + this.blockState);
return AIR_STRING;
}
this.serialString = resourceLocation.getNamespace() + RESOURCE_LOCATION_SEPARATOR + resourceLocation.getPath()
+ STATE_STRING_SEPARATOR + serializeBlockStateProperties(this.blockState);
return this.serialString;
}
/** will only work if a level is currently loaded */
public static IBlockStateWrapper deserialize(String resourceStateString, ILevelWrapper levelWrapper) throws IOException
{
// we need the final string for the concurrent hash map later
final String finalResourceStateString = resourceStateString;
if (finalResourceStateString.equals(AIR_STRING) || finalResourceStateString.equals("")) // the empty string shouldn't normally happen, but just in case
{
return AIR;
}
// attempt to use the existing wrapper
if (WRAPPER_BY_RESOURCE_LOCATION.containsKey(finalResourceStateString))
{
return WRAPPER_BY_RESOURCE_LOCATION.get(finalResourceStateString);
}
// if no wrapper is found, default to air
BlockStateWrapper foundWrapper = AIR;
try
{
// try to parse out the BlockState
String blockStatePropertiesString = null; // will be null if no properties were included
int stateSeparatorIndex = resourceStateString.indexOf(STATE_STRING_SEPARATOR);
if (stateSeparatorIndex != -1)
{
// blockstate properties found
blockStatePropertiesString = resourceStateString.substring(stateSeparatorIndex + STATE_STRING_SEPARATOR.length());
resourceStateString = resourceStateString.substring(0, stateSeparatorIndex);
}
// parse the resource location
int separatorIndex = resourceStateString.indexOf(RESOURCE_LOCATION_SEPARATOR);
if (separatorIndex == -1)
{
throw new IOException("Unable to parse Resource Location out of string: [" + resourceStateString + "].");
}
ResourceLocation resourceLocation;
try
{
#if MC_VER < MC_1_21_1
resourceLocation = new ResourceLocation(resourceStateString.substring(0, separatorIndex), resourceStateString.substring(separatorIndex + 1));
#else
resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceStateString.substring(0, separatorIndex), resourceStateString.substring(separatorIndex + 1));
#endif
}
catch (Exception e)
{
throw new IOException("No Resource Location found for the string: [" + resourceStateString + "] Error: [" + e.getMessage() + "].");
}
// attempt to get the BlockState from all possible BlockStates
try
{
#if MC_VER > MC_1_17_1
LodUtil.assertTrue(levelWrapper != null && levelWrapper.getWrappedMcObject() != null);
Level level = (Level)levelWrapper.getWrappedMcObject();
#endif
Block block;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
block = Registry.BLOCK.get(resourceLocation);
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
block = registryAccess.registryOrThrow(Registry.BLOCK_REGISTRY).get(resourceLocation);
#elif MC_VER < MC_1_21_3
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
block = registryAccess.registryOrThrow(Registries.BLOCK).get(resourceLocation);
#else
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
Optional<Holder.Reference<Block>> optionalBlockHolder = registryAccess.lookupOrThrow(Registries.BLOCK).get(resourceLocation);
block = optionalBlockHolder.isPresent() ? optionalBlockHolder.get().value() : null;
#endif
if (block == null)
{
// shouldn't normally happen, but here to make the compiler happy
if (!BROKEN_RESOURCE_LOCATIONS.contains(resourceLocation))
{
BROKEN_RESOURCE_LOCATIONS.add(resourceLocation);
LOGGER.warn("Unable to find BlockState with the resourceLocation [" + resourceLocation + "] and properties: [" + blockStatePropertiesString + "]. Air will be used instead, some data may be lost.");
}
return AIR;
}
// attempt to find the blockstate from all possibilities
BlockState foundState = null;
if (blockStatePropertiesString != null)
{
List<BlockState> possibleStateList = block.getStateDefinition().getPossibleStates();
for (BlockState possibleState : possibleStateList)
{
String possibleStatePropertiesString = serializeBlockStateProperties(possibleState);
if (possibleStatePropertiesString.equals(blockStatePropertiesString))
{
foundState = possibleState;
break;
}
}
}
// use the default if no state was found or given
if (foundState == null)
{
if (blockStatePropertiesString != null)
{
// we should have found a blockstate, but didn't
if (!BROKEN_RESOURCE_LOCATIONS.contains(resourceLocation))
{
BROKEN_RESOURCE_LOCATIONS.add(resourceLocation);
LOGGER.warn("Unable to find BlockState for Block [" + resourceLocation + "] with properties: [" + blockStatePropertiesString + "]. Using the default block state.");
}
}
foundState = block.defaultBlockState();
}
foundWrapper = new BlockStateWrapper(foundState, levelWrapper);
return foundWrapper;
}
catch (Exception e)
{
throw new IOException("Failed to deserialize the string [" + finalResourceStateString + "] into a BlockStateWrapper: " + e.getMessage(), e);
}
}
finally
{
// put if absent in case two threads deserialize at the same time
// unfortunately we can't put everything in a computeIfAbsent() since we also throw exceptions
WRAPPER_BY_RESOURCE_LOCATION.putIfAbsent(finalResourceStateString, foundWrapper);
}
}
/** used to compare and save BlockStates based on their properties */
private static String serializeBlockStateProperties(BlockState blockState)
{
// get the property list for this block (doesn't contain this block state's values, just the names and possible values)
java.util.Collection<net.minecraft.world.level.block.state.properties.Property<?>> blockPropertyCollection = blockState.getProperties();
// alphabetically sort the list so they are always in the same order
List<net.minecraft.world.level.block.state.properties.Property<?>> sortedBlockPropteryList = new ArrayList<>(blockPropertyCollection);
sortedBlockPropteryList.sort((a, b) -> a.getName().compareTo(b.getName()));
StringBuilder stringBuilder = new StringBuilder();
for (net.minecraft.world.level.block.state.properties.Property<?> property : sortedBlockPropteryList)
{
String propertyName = property.getName();
String value = "NULL";
if (blockState.hasProperty(property))
{
value = blockState.getValue(property).toString();
}
stringBuilder.append("{");
stringBuilder.append(propertyName).append(RESOURCE_LOCATION_SEPARATOR).append(value);
stringBuilder.append("}");
}
return stringBuilder.toString();
}
//==============//
// Iris methods //
//==============//
private EDhApiBlockMaterial calculateEDhApiBlockMaterialId()
{
if (this.blockState == null)
{
return EDhApiBlockMaterial.AIR;
}
String serialString = this.getSerialString().toLowerCase();
if (this.blockState.is(BlockTags.LEAVES)
|| serialString.contains("bamboo")
|| serialString.contains("cactus")
|| serialString.contains("chorus_flower")
|| serialString.contains("mushroom")
)
{
return EDhApiBlockMaterial.LEAVES;
}
else if (this.blockState.is(Blocks.LAVA))
{
return EDhApiBlockMaterial.LAVA;
}
else if (this.isLiquid() || this.blockState.is(Blocks.WATER))
{
return EDhApiBlockMaterial.WATER;
}
else if (this.blockState.getSoundType() == SoundType.WOOD
|| serialString.contains("root")
#if MC_VER >= MC_1_19_4
|| this.blockState.getSoundType() == SoundType.CHERRY_WOOD
#endif
)
{
return EDhApiBlockMaterial.WOOD;
}
else if (this.blockState.getSoundType() == SoundType.METAL
#if MC_VER >= MC_1_19_2
|| this.blockState.getSoundType() == SoundType.COPPER
#endif
#if MC_VER >= MC_1_20_4
|| this.blockState.getSoundType() == SoundType.COPPER_BULB
|| this.blockState.getSoundType() == SoundType.COPPER_GRATE
#endif
)
{
return EDhApiBlockMaterial.METAL;
}
else if (serialString.contains("grass_block"))
{
return EDhApiBlockMaterial.GRASS;
}
else if (
serialString.contains("dirt")
|| serialString.contains("gravel")
|| serialString.contains("mud")
|| serialString.contains("podzol")
|| serialString.contains("mycelium")
)
{
return EDhApiBlockMaterial.DIRT;
}
#if MC_VER >= MC_1_17_1
else if (this.blockState.getSoundType() == SoundType.DEEPSLATE
|| this.blockState.getSoundType() == SoundType.DEEPSLATE_BRICKS
|| this.blockState.getSoundType() == SoundType.DEEPSLATE_TILES
|| this.blockState.getSoundType() == SoundType.POLISHED_DEEPSLATE
|| serialString.contains("deepslate") )
{
return EDhApiBlockMaterial.DEEPSLATE;
}
#endif
else if (this.serialString.contains("snow"))
{
return EDhApiBlockMaterial.SNOW;
}
else if (serialString.contains("sand"))
{
return EDhApiBlockMaterial.SAND;
}
else if (serialString.contains("terracotta"))
{
return EDhApiBlockMaterial.TERRACOTTA;
}
else if (this.blockState.is(BlockTags.BASE_STONE_NETHER))
{
return EDhApiBlockMaterial.NETHER_STONE;
}
else if (serialString.contains("stone")
|| serialString.contains("ore"))
{
return EDhApiBlockMaterial.STONE;
}
else if (this.blockState.getLightEmission() > 0)
{
return EDhApiBlockMaterial.ILLUMINATED;
}
else
{
return EDhApiBlockMaterial.UNKNOWN;
}
}
}
@@ -0,0 +1,485 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.block;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
import com.seibel.distanthorizons.core.util.ColorUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.core.Direction;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.FlowerBlock;
import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.RotatedPillarBlock;
#if MC_VER >= MC_1_19_2
import net.minecraft.util.RandomSource;
#else
import java.util.Random;
#endif
import net.minecraft.world.level.block.state.BlockState;
import org.apache.logging.log4j.Logger;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
/**
* This stores and calculates the colors
* the given {@link BlockState} should have based
* on the given {@link IClientLevelWrapper}.
*
* @see ColorUtil
*/
public class ClientBlockStateColorCache
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private static final HashSet<BlockState> BLOCK_STATES_THAT_NEED_LEVEL = new HashSet<>();
private static final HashSet<BlockState> BROKEN_BLOCK_STATES = new HashSet<>();
/**
* Methods using MC's "RandomSource" object aren't thread safe <br>
* so we need to put locks around that logic. <br>
* specifically:
* <code>
* getBlockModel(this.blockState).getQuads(this.blockState, direction, RANDOM)
* </code>
*/
private static final ReentrantLock RESOLVE_LOCK = new ReentrantLock();
/** This is the order each direction on a block is processed when attempting to get the texture/color */
private static final Direction[] COLOR_RESOLUTION_DIRECTION_ORDER = { Direction.UP, Direction.NORTH, Direction.EAST, Direction.WEST, Direction.SOUTH, Direction.DOWN };
private static final int FLOWER_COLOR_SCALE = 5;
#if MC_VER < MC_1_19_2
private static final Random RANDOM = new Random(0);
#else
/** Note: this object isn't thread safe and must be put in a lock */
private static final RandomSource RANDOM = RandomSource.create();
#endif
private final IClientLevelWrapper levelWrapper;
private final BlockState blockState;
private final LevelReader level;
private boolean isColorResolved = false;
private int baseColor = 0;
private boolean needShade = true;
private boolean needPostTinting = false;
private int tintIndex = 0;
//===========//
// constants //
//===========//
private static final int MIN_SRGB_BITS = 0x39000000; // 2^(-13)
private static final int MAX_SRGB_BITS = 0x3f7fffff; // 1.0 - f32::EPSILON
private static final float MIN_SRGB_BOUND = Float.intBitsToFloat(MIN_SRGB_BITS);
private static final float MAX_SRGB_BOUND = Float.intBitsToFloat(MAX_SRGB_BITS);
private static final int[] linearToSrgbTable = new int[]
{
0x0073000d, 0x007a000d, 0x0080000d, 0x0087000d, 0x008d000d, 0x0094000d, 0x009a000d, 0x00a1000d,
0x00a7001a, 0x00b4001a, 0x00c1001a, 0x00ce001a, 0x00da001a, 0x00e7001a, 0x00f4001a, 0x0101001a,
0x010e0033, 0x01280033, 0x01410033, 0x015b0033, 0x01750033, 0x018f0033, 0x01a80033, 0x01c20033,
0x01dc0067, 0x020f0067, 0x02430067, 0x02760067, 0x02aa0067, 0x02dd0067, 0x03110067, 0x03440067,
0x037800ce, 0x03df00ce, 0x044600ce, 0x04ad00ce, 0x051400ce, 0x057b00c5, 0x05dd00bc, 0x063b00b5,
0x06970158, 0x07420142, 0x07e30130, 0x087b0120, 0x090b0112, 0x09940106, 0x0a1700fc, 0x0a9500f2,
0x0b0f01cb, 0x0bf401ae, 0x0ccb0195, 0x0d950180, 0x0e56016e, 0x0f0d015e, 0x0fbc0150, 0x10630143,
0x11070264, 0x1238023e, 0x1357021d, 0x14660201, 0x156601e9, 0x165a01d3, 0x174401c0, 0x182401af,
0x18fe0331, 0x1a9602fe, 0x1c1502d2, 0x1d7e02ad, 0x1ed4028d, 0x201a0270, 0x21520256, 0x227d0240,
0x239f0443, 0x25c003fe, 0x27bf03c4, 0x29a10392, 0x2b6a0367, 0x2d1d0341, 0x2ebe031f, 0x304d0300,
0x31d105b0, 0x34a80555, 0x37520507, 0x39d504c5, 0x3c37048b, 0x3e7c0458, 0x40a8042a, 0x42bd0401,
0x44c20798, 0x488e071e, 0x4c1c06b6, 0x4f76065d, 0x52a50610, 0x55ac05cc, 0x5892058f, 0x5b590559,
0x5e0c0a23, 0x631c0980, 0x67db08f6, 0x6c55087f, 0x70940818, 0x74a007bd, 0x787d076c, 0x7c330723,
};
private static final float[] srgbToLinearTable = new float[]
{
0.0f, 0.000303527f, 0.000607054f, 0.00091058103f, 0.001214108f, 0.001517635f, 0.0018211621f, 0.002124689f,
0.002428216f, 0.002731743f, 0.00303527f, 0.0033465356f, 0.003676507f, 0.004024717f, 0.004391442f,
0.0047769533f, 0.005181517f, 0.0056053917f, 0.0060488326f, 0.006512091f, 0.00699541f, 0.0074990317f,
0.008023192f, 0.008568125f, 0.009134057f, 0.009721218f, 0.010329823f, 0.010960094f, 0.011612245f,
0.012286487f, 0.012983031f, 0.013702081f, 0.014443844f, 0.015208514f, 0.015996292f, 0.016807375f,
0.017641952f, 0.018500218f, 0.019382361f, 0.020288562f, 0.02121901f, 0.022173883f, 0.023153365f,
0.02415763f, 0.025186857f, 0.026241222f, 0.027320892f, 0.028426038f, 0.029556843f, 0.03071345f, 0.03189604f,
0.033104774f, 0.03433981f, 0.035601325f, 0.036889452f, 0.038204376f, 0.039546248f, 0.04091521f, 0.042311423f,
0.043735042f, 0.045186214f, 0.046665095f, 0.048171833f, 0.049706575f, 0.051269468f, 0.052860655f, 0.05448028f,
0.056128494f, 0.057805434f, 0.05951124f, 0.06124607f, 0.06301003f, 0.06480328f, 0.06662595f, 0.06847818f,
0.07036011f, 0.07227186f, 0.07421358f, 0.07618539f, 0.07818743f, 0.08021983f, 0.082282715f, 0.084376216f,
0.086500466f, 0.088655606f, 0.09084173f, 0.09305898f, 0.095307484f, 0.09758736f, 0.09989874f, 0.10224175f,
0.10461649f, 0.10702311f, 0.10946172f, 0.111932434f, 0.11443538f, 0.116970696f, 0.11953845f, 0.12213881f,
0.12477186f, 0.12743773f, 0.13013652f, 0.13286836f, 0.13563336f, 0.13843165f, 0.14126332f, 0.1441285f,
0.1470273f, 0.14995982f, 0.15292618f, 0.1559265f, 0.15896086f, 0.16202943f, 0.16513224f, 0.16826946f,
0.17144115f, 0.17464745f, 0.17788847f, 0.1811643f, 0.18447503f, 0.1878208f, 0.19120172f, 0.19461787f,
0.19806935f, 0.2015563f, 0.20507877f, 0.2086369f, 0.21223079f, 0.21586053f, 0.21952623f, 0.22322798f,
0.22696589f, 0.23074007f, 0.23455065f, 0.23839766f, 0.2422812f, 0.2462014f, 0.25015837f, 0.25415218f,
0.2581829f, 0.26225072f, 0.26635566f, 0.27049786f, 0.27467737f, 0.27889434f, 0.2831488f, 0.2874409f,
0.2917707f, 0.29613832f, 0.30054384f, 0.30498737f, 0.30946895f, 0.31398875f, 0.31854683f, 0.32314324f,
0.32777813f, 0.33245158f, 0.33716366f, 0.34191445f, 0.3467041f, 0.3515327f, 0.35640025f, 0.36130688f,
0.3662527f, 0.37123778f, 0.37626222f, 0.3813261f, 0.38642952f, 0.39157256f, 0.3967553f, 0.40197787f,
0.4072403f, 0.4125427f, 0.41788515f, 0.42326775f, 0.42869055f, 0.4341537f, 0.43965724f, 0.44520125f,
0.45078585f, 0.45641106f, 0.46207705f, 0.46778384f, 0.47353154f, 0.47932023f, 0.48514998f, 0.4910209f,
0.49693304f, 0.5028866f, 0.50888145f, 0.5149178f, 0.5209957f, 0.52711535f, 0.5332766f, 0.5394797f,
0.5457247f, 0.5520116f, 0.5583406f, 0.5647117f, 0.57112503f, 0.57758063f, 0.5840786f, 0.590619f, 0.597202f,
0.60382754f, 0.61049575f, 0.61720675f, 0.62396055f, 0.63075733f, 0.637597f, 0.6444799f, 0.6514058f,
0.65837497f, 0.66538745f, 0.67244333f, 0.6795426f, 0.68668544f, 0.69387203f, 0.70110214f, 0.70837605f,
0.7156938f, 0.72305536f, 0.730461f, 0.7379107f, 0.7454045f, 0.75294244f, 0.76052475f, 0.7681514f, 0.77582246f,
0.78353804f, 0.79129815f, 0.79910296f, 0.8069525f, 0.8148468f, 0.822786f, 0.8307701f, 0.83879924f, 0.84687346f,
0.8549928f, 0.8631574f, 0.87136734f, 0.8796226f, 0.8879232f, 0.89626956f, 0.90466136f, 0.913099f, 0.92158204f,
0.93011117f, 0.9386859f, 0.9473069f, 0.9559735f, 0.9646866f, 0.9734455f, 0.98225087f, 0.9911022f, 1.0f
};
//=============//
// constructor //
//=============//
public ClientBlockStateColorCache(BlockState blockState, IClientLevelWrapper samplingLevel)
{
this.blockState = blockState;
this.levelWrapper = samplingLevel;
this.level = (LevelReader) samplingLevel.getWrappedMcObject();
this.resolveColors();
}
//===================//
// color calculation //
//===================//
private void resolveColors()
{
if (this.isColorResolved)
{
return;
}
try
{
// getQuads() isn't thread safe so we need to put this logic in a lock
RESOLVE_LOCK.lock();
if (this.blockState.getFluidState().isEmpty())
{
// look for the first non-empty direction
List<BakedQuad> quads = null;
for (Direction direction : COLOR_RESOLUTION_DIRECTION_ORDER)
{
quads = Minecraft.getInstance().getModelManager().getBlockModelShaper().
getBlockModel(this.blockState).getQuads(this.blockState, direction, RANDOM);
if (quads != null && !quads.isEmpty()
&& !(
this.blockState.getBlock() instanceof RotatedPillarBlock
&& direction == Direction.UP
)
)
{
break;
}
}
if (quads == null || quads.isEmpty())
{
quads = Minecraft.getInstance().getModelManager().getBlockModelShaper().
getBlockModel(this.blockState).getQuads(this.blockState, null, RANDOM);
}
if (quads != null && !quads.isEmpty())
{
this.needPostTinting = quads.get(0).isTinted();
this.needShade = quads.get(0).isShade();
this.tintIndex = quads.get(0).getTintIndex();
this.baseColor = calculateColorFromTexture(
#if MC_VER < MC_1_17_1 quads.get(0).sprite,
#else quads.get(0).getSprite(), #endif
ColorMode.getColorMode(this.blockState.getBlock()));
}
else
{
// Backup method.
this.needPostTinting = false;
this.needShade = false;
this.tintIndex = 0;
this.baseColor = calculateColorFromTexture(Minecraft.getInstance().getModelManager().getBlockModelShaper().getParticleIcon(this.blockState),
ColorMode.getColorMode(this.blockState.getBlock()));
}
}
else
{
// Liquid Block
this.needPostTinting = true;
this.needShade = false;
this.tintIndex = 0;
this.baseColor = calculateColorFromTexture(Minecraft.getInstance().getModelManager().getBlockModelShaper().getParticleIcon(this.blockState),
ColorMode.getColorMode(this.blockState.getBlock()));
}
this.isColorResolved = true;
}
finally
{
RESOLVE_LOCK.unlock();
}
}
//TODO: Perhaps make this not just use the first frame?
private static int calculateColorFromTexture(TextureAtlasSprite texture, ColorMode colorMode)
{
int count = 0;
int alpha = 0;
double red = 0;
double green = 0;
double blue = 0;
int tempColor;
// don't render Chiseled blocks.
// Since ColorMode is set per block, you only need to check this once.
if (colorMode != ColorMode.Chisel)
{
// textures normally use u and v instead of x and y
for (int v = 0; v < getTextureHeight(texture); v++)
{
for (int u = 0; u < getTextureWidth(texture); u++)
{
//note: Minecraft color format is: 0xAA BB GG RR
//________ DH mod color format is: 0xAA RR GG BB
//OpenGL RGBA format native order: 0xRR GG BB AA
//_ OpenGL RGBA format Java Order: 0xAA BB GG RR
tempColor = TextureAtlasSpriteWrapper.getPixelRGBA(texture, 0, u, v);
int r = (tempColor & 0x000000FF);
int g = (tempColor & 0x0000FF00) >>> 8;
int b = (tempColor & 0x00FF0000) >>> 16;
int a = (tempColor & 0xFF000000) >>> 24;
int scale = 1;
if (colorMode == ColorMode.Leaves)
{
//switch (//FIXME add config option)
// case BLACK:
// a = 255; //simulate black background of fast leaves
// break;
// case IGNORE:
if (a == 0) {
continue; //same long grass
}
else
{
a = 255; //just in case there are semi transparent pixels
}
// break;
// case TRANSPARENT:
// break; //do nothing, let it count towards transparency
}
else if (a == 0 && colorMode != ColorMode.Glass)
{
continue;
}
else if (colorMode == ColorMode.Flower && (g + 25 < b || g + 25 < r))
{
scale = FLOWER_COLOR_SCALE;
}
count += scale;
//apparently alpha is linear
alpha += a * scale;
//gamma correction is complicated
red += srgbToLinearTable[r] * a * scale;
green += srgbToLinearTable[g] * a * scale;
blue += srgbToLinearTable[b] * a * scale;
}
}
}
if (count == 0)
{
// this block is entirely transparent
tempColor = ColorUtil.argbToInt(0, 255, 255, 255);
}
else
{
// determine the average color
tempColor = ColorUtil.argbToInt(
alpha / count,
linearToSrgb((float) (red / (double) alpha)),
linearToSrgb((float) (green / (double) alpha)),
linearToSrgb((float) (blue / (double) alpha)));
}
//check if not missing texture
if (tempColor == ColorUtil.argbToInt(255, 182, 0, 182))
{
//make it not render at all
tempColor = ColorUtil.argbToInt(0, 255, 255, 255);
}
return tempColor;
}
private static int getTextureWidth(TextureAtlasSprite texture)
{
#if MC_VER < MC_1_19_4
return texture.getWidth();
#else
return texture.contents().width();
#endif
}
private static int getTextureHeight(TextureAtlasSprite texture)
{
#if MC_VER < MC_1_19_4
return texture.getHeight();
#else
return texture.contents().height();
#endif
}
/**
* This method was suggested by IMS from the Iris/Sodium team.
* That's where the numbers and code are based.
*/
private static int linearToSrgb(float c)
{
if (!(c > MIN_SRGB_BOUND)) {
c = MIN_SRGB_BOUND;
}
if (c > MAX_SRGB_BOUND) {
c = MAX_SRGB_BOUND;
}
int inputBits = Float.floatToRawIntBits(c);
int entry = linearToSrgbTable[((inputBits - MIN_SRGB_BITS) >> 20)];
int bias = (entry >>> 16) << 9;
int scale = entry & 0xffff;
int t = (inputBits >>> 12) & 0xff;
return (bias + (scale * t)) >>> 16;
}
//===============//
// public getter //
//===============//
public int getColor(BiomeWrapper biome, DhBlockPos pos)
{
// only get the tint if the block needs to be tinted
if (!this.needPostTinting)
{
return this.baseColor;
}
// don't try tinting blocks that don't support our method of tint getting
if (BROKEN_BLOCK_STATES.contains(this.blockState))
{
return this.baseColor;
}
// attempt to get the tint
int tintColor = -1;
try
{
// try to use the fast tint getter logic first
if (!BLOCK_STATES_THAT_NEED_LEVEL.contains(this.blockState))
{
try
{
tintColor = Minecraft.getInstance().getBlockColors()
.getColor(this.blockState, new TintWithoutLevelOverrider(biome, this.levelWrapper), McObjectConverter.Convert(pos), this.tintIndex);
}
catch (UnsupportedOperationException e)
{
// this exception generally occurs if the tint requires other blocks besides itself
LOGGER.debug("Unable to use ["+TintWithoutLevelOverrider.class.getSimpleName()+"] to get the block tint for block: [" + this.blockState + "] and biome: [" + biome + "] at pos: " + pos + ". Error: [" + e.getMessage() + "]. Attempting to use backup method...", e);
BLOCK_STATES_THAT_NEED_LEVEL.add(this.blockState);
}
}
// use the level logic only if requested
if (BLOCK_STATES_THAT_NEED_LEVEL.contains(this.blockState))
{
// this logic can't be used all the time due to it breaking some blocks tinting
// specifically oceans don't render correctly
tintColor = Minecraft.getInstance().getBlockColors()
.getColor(this.blockState, new TintGetterOverrideFast(this.level), McObjectConverter.Convert(pos), this.tintIndex);
}
}
catch (Exception e)
{
// only display the error once per block/biome type to reduce log spam
if (!BROKEN_BLOCK_STATES.contains(this.blockState))
{
LOGGER.warn("Failed to get block color for block: [" + this.blockState + "] and biome: [" + biome + "] at pos: " + pos + ". Error: ["+e.getMessage() + "]. Note: future errors for this block/biome will be ignored.", e);
BROKEN_BLOCK_STATES.add(this.blockState);
}
}
if (tintColor != -1)
{
return ColorUtil.multiplyARGBwithRGB(this.baseColor, tintColor);
}
else
{
// unable to get the tinted color, use the base color instead
return this.baseColor;
}
}
//================//
// helper classes //
//================//
enum ColorMode
{
Default,
Flower,
Leaves,
Chisel,
Glass;
static ColorMode getColorMode(Block block)
{
if (block instanceof LeavesBlock) return Leaves;
if (block instanceof FlowerBlock) return Flower;
if (block.toString().contains("glass")) return Glass;
if (block.toString().equals("Block{chiselsandbits:chiseled}")) return Chisel;
return Default;
}
}
}
@@ -0,0 +1,78 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.block;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
#if MC_VER < MC_1_17_1
#elif MC_VER < MC_1_21_3
#else
import com.seibel.distanthorizons.core.util.ColorUtil;
import net.minecraft.client.renderer.texture.SpriteContents;
#endif
/**
* For wrapping/utilizing around TextureAtlasSprite
*
* @author Ran
*/
public class TextureAtlasSpriteWrapper
{
public static int getPixelRGBA(TextureAtlasSprite sprite, int frameIndex, int x, int y)
{
#if MC_VER < MC_1_17_1
return sprite.mainImage[0].getPixelRGBA(
x + sprite.framesX[frameIndex] * sprite.getWidth(),
y + sprite.framesY[frameIndex] * sprite.getHeight());
#elif MC_VER < MC_1_19_4
if (sprite.animatedTexture != null)
{
x += sprite.animatedTexture.getFrameX(frameIndex) * sprite.width;
y += sprite.animatedTexture.getFrameY(frameIndex) * sprite.height;
}
return sprite.mainImage[0].getPixelRGBA(x, y);
#elif MC_VER < MC_1_21_3
if (sprite.contents().animatedTexture != null)
{
x += sprite.contents().animatedTexture.getFrameX(frameIndex) * sprite.contents().width();
y += sprite.contents().animatedTexture.getFrameY(frameIndex) * sprite.contents().width();
}
return sprite.contents().originalImage.getPixelRGBA(x, y);
#else
SpriteContents content = sprite.contents(); // don't close, otherwise MC will be corrupted and you won't be able to re-access the texture
if (content.animatedTexture != null)
{
x += content.animatedTexture.getFrameX(frameIndex) * content.width();
y += content.animatedTexture.getFrameY(frameIndex) * content.width();
}
int abgr = content.originalImage.getPixel(x, y);
// re-pack the color so we can access it normally
int a = (abgr & 0xFF000000) >>> 24;
int b = (abgr & 0x00FF0000) >>> 16;
int g = (abgr & 0x0000FF00) >>> 8;
int r = (abgr & 0x000000FF);
return ColorUtil.argbToInt(a, r, g, b);
#endif
}
}
@@ -0,0 +1,194 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.block;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.*;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.lighting.LevelLightEngine;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.jetbrains.annotations.Nullable;
import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Stream;
public class TintGetterOverrideFast implements BlockAndTintGetter
{
LevelReader parent;
//=============//
// constructor //
//=============//
public TintGetterOverrideFast(LevelReader parent) { this.parent = parent; }
//=========//
// methods //
//=========//
private Biome _getBiome(BlockPos pos)
{
#if MC_VER >= MC_1_18_2
return this.parent.getBiome(pos).value();
#else
return parent.getBiome(pos);
#endif
}
@Override
public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) { return colorResolver.getColor(this._getBiome(blockPos), blockPos.getX(), blockPos.getZ()); }
@Override
public float getShade(Direction direction, boolean bl) { return this.parent.getShade(direction, bl); }
@Override
public LevelLightEngine getLightEngine() { return this.parent.getLightEngine(); }
@Override
public int getBrightness(LightLayer lightLayer, BlockPos blockPos) { return this.parent.getBrightness(lightLayer, blockPos); }
@Override
public int getRawBrightness(BlockPos blockPos, int i) { return this.parent.getRawBrightness(blockPos, i); }
@Override
public boolean canSeeSky(BlockPos blockPos) { return this.parent.canSeeSky(blockPos); }
@Override
@Nullable
public BlockEntity getBlockEntity(BlockPos blockPos) { return this.parent.getBlockEntity(blockPos); }
@Override
public BlockState getBlockState(BlockPos blockPos) { return this.parent.getBlockState(blockPos); }
@Override
public FluidState getFluidState(BlockPos blockPos) { return this.parent.getFluidState(blockPos); }
@Override
public int getLightEmission(BlockPos blockPos) { return this.parent.getLightEmission(blockPos); }
#if MC_VER < MC_1_21_3
@Override
public int getMaxLightLevel() { return parent.getMaxLightLevel(); }
#else
#endif
@Override
public Stream<BlockState> getBlockStates(AABB aABB)
{ return this.parent.getBlockStates(aABB); }
@Override
public BlockHitResult clip(ClipContext clipContext)
{ return this.parent.clip(clipContext); }
@Override
@Nullable
public BlockHitResult clipWithInteractionOverride(Vec3 vec3, Vec3 vec32, BlockPos blockPos, VoxelShape voxelShape, BlockState blockState)
{ return this.parent.clipWithInteractionOverride(vec3, vec32, blockPos, voxelShape, blockState); }
@Override
public double getBlockFloorHeight(VoxelShape voxelShape, Supplier<VoxelShape> supplier)
{ return this.parent.getBlockFloorHeight(voxelShape, supplier); }
@Override
public double getBlockFloorHeight(BlockPos blockPos) { return this.parent.getBlockFloorHeight(blockPos); }
#if MC_VER < MC_1_21_3
@Override
public int getMaxBuildHeight() { return this.parent.getMaxBuildHeight(); }
#else
@Override
public int getMaxY() { return this.parent.getMaxY(); }
#endif
//==============//
// post MC 1.17 //
//==============//
#if MC_VER >= MC_1_17_1
@Override
public <T extends BlockEntity> Optional<T> getBlockEntity(BlockPos blockPos, BlockEntityType<T> blockEntityType)
{ return this.parent.getBlockEntity(blockPos, blockEntityType); }
@Override
public BlockHitResult isBlockInLine(ClipBlockStateContext clipBlockStateContext)
{ return this.parent.isBlockInLine(clipBlockStateContext); }
@Override
public int getHeight() { return this.parent.getHeight(); }
#if MC_VER < MC_1_21_3
@Override
public int getMinBuildHeight() { return this.parent.getMinBuildHeight(); }
#else
@Override
public int getMinY() { return this.parent.getMinY(); }
#endif
@Override
public int getSectionsCount() { return this.parent.getSectionsCount(); }
#if MC_VER < MC_1_21_3
@Override
public int getMinSection() { return this.parent.getMinSection(); }
#else
@Override
public int getMinSectionY() { return BlockAndTintGetter.super.getMinSectionY(); }
#endif
#if MC_VER < MC_1_21_3
@Override
public int getMaxSection() { return this.parent.getMaxSection(); }
#else
@Override
public int getMaxSectionY() { return this.parent.getMaxSectionY(); }
#endif
@Override
public boolean isOutsideBuildHeight(BlockPos blockPos) { return this.parent.isOutsideBuildHeight(blockPos); }
@Override
public boolean isOutsideBuildHeight(int i) { return this.parent.isOutsideBuildHeight(i); }
@Override
public int getSectionIndex(int i) { return this.parent.getSectionIndex(i); }
@Override
public int getSectionIndexFromSectionY(int i) { return this.parent.getSectionIndexFromSectionY(i); }
@Override
public int getSectionYFromSectionIndex(int i) { return this.parent.getSectionYFromSectionIndex(i); }
#endif
}
@@ -0,0 +1,214 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.block;
import com.seibel.distanthorizons.core.util.LodUtil;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Cursor3D;
import net.minecraft.core.Direction;
import net.minecraft.world.level.*;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.lighting.LevelLightEngine;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.jetbrains.annotations.Nullable;
import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Stream;
public class TintGetterOverrideSmooth implements BlockAndTintGetter
{
LevelReader parent;
public int smoothingRange;
//=============//
// constructor //
//=============//
public TintGetterOverrideSmooth(LevelReader parent, int smoothingRange)
{
this.parent = parent;
this.smoothingRange = smoothingRange;
}
//=========//
// methods //
//=========//
private Biome _getBiome(BlockPos pos)
{
#if MC_VER >= MC_1_18_2
return this.parent.getBiome(pos).value();
#else
return parent.getBiome(pos);
#endif
}
public int calculateBlockTint(BlockPos blockPos, ColorResolver colorResolver)
{
int i = smoothingRange;
if (i == 0)
return colorResolver.getColor(_getBiome(blockPos), blockPos.getX(), blockPos.getZ());
int j = (i * 2 + 1) * (i * 2 + 1);
int k = 0;
int l = 0;
int m = 0;
Cursor3D cursor3D = new Cursor3D(blockPos.getX() - i, blockPos.getY(), blockPos.getZ() - i, blockPos.getX() + i, blockPos.getY(), blockPos.getZ() + i);
BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
while (cursor3D.advance())
{
mutableBlockPos.set(cursor3D.nextX(), cursor3D.nextY(), cursor3D.nextZ());
int n = colorResolver.getColor(this._getBiome(mutableBlockPos), mutableBlockPos.getX(), mutableBlockPos.getZ());
k += (n & 0xFF0000) >> 16;
l += (n & 0xFF00) >> 8;
m += n & 0xFF;
}
return (k / j & 0xFF) << 16 | (l / j & 0xFF) << 8 | m / j & 0xFF;
}
@Override
public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) { return this.calculateBlockTint(blockPos, colorResolver); }
@Override
public float getShade(Direction direction, boolean bl) { return this.parent.getShade(direction, bl); }
@Override
public LevelLightEngine getLightEngine() { return this.parent.getLightEngine(); }
@Override
public int getBrightness(LightLayer lightLayer, BlockPos blockPos) { return this.parent.getBrightness(lightLayer, blockPos); }
@Override
public int getRawBrightness(BlockPos blockPos, int i) { return this.parent.getRawBrightness(blockPos, i); }
@Override
public boolean canSeeSky(BlockPos blockPos) { return this.parent.canSeeSky(blockPos); }
@Override
@Nullable
public BlockEntity getBlockEntity(BlockPos blockPos) { return this.parent.getBlockEntity(blockPos); }
@Override
public BlockState getBlockState(BlockPos blockPos) { return this.parent.getBlockState(blockPos); }
@Override
public FluidState getFluidState(BlockPos blockPos) { return this.parent.getFluidState(blockPos); }
@Override
public int getLightEmission(BlockPos blockPos) { return this.parent.getLightEmission(blockPos); }
#if MC_VER < MC_1_21_3
@Override
public int getMaxLightLevel() { return this.parent.getMaxLightLevel(); }
#else
#endif
@Override
public Stream<BlockState> getBlockStates(AABB aABB) { return this.parent.getBlockStates(aABB); }
@Override
public BlockHitResult clip(ClipContext clipContext) { return this.parent.clip(clipContext); }
@Override
@Nullable
public BlockHitResult clipWithInteractionOverride(Vec3 vec3, Vec3 vec32, BlockPos blockPos, VoxelShape voxelShape, BlockState blockState)
{
return this.parent.clipWithInteractionOverride(vec3, vec32, blockPos, voxelShape, blockState);
}
@Override
public double getBlockFloorHeight(VoxelShape voxelShape, Supplier<VoxelShape> supplier) { return this.parent.getBlockFloorHeight(voxelShape, supplier); }
@Override
public double getBlockFloorHeight(BlockPos blockPos) { return this.parent.getBlockFloorHeight(blockPos); }
#if MC_VER < MC_1_21_3
@Override
public int getMaxBuildHeight() { return this.parent.getMaxBuildHeight(); }
#else
@Override
public int getMaxY() { return this.parent.getMaxY(); }
#endif
#if MC_VER >= MC_1_17_1
@Override
public <T extends BlockEntity> Optional<T> getBlockEntity(BlockPos blockPos, BlockEntityType<T> blockEntityType) { return this.parent.getBlockEntity(blockPos, blockEntityType); }
@Override
public BlockHitResult isBlockInLine(ClipBlockStateContext clipBlockStateContext) { return this.parent.isBlockInLine(clipBlockStateContext); }
@Override
public int getHeight() { return this.parent.getHeight(); }
#if MC_VER < MC_1_21_3
@Override
public int getMinBuildHeight() { return this.parent.getMinBuildHeight(); }
#else
@Override
public int getMinY() { return this.parent.getMinY(); }
#endif
@Override
public int getSectionsCount() { return this.parent.getSectionsCount(); }
#if MC_VER < MC_1_21_3
@Override
public int getMinSection() { return this.parent.getMinSection(); }
#else
@Override
public int getMinSectionY() { return BlockAndTintGetter.super.getMinSectionY(); }
#endif
#if MC_VER < MC_1_21_3
@Override
public int getMaxSection() { return this.parent.getMaxSection(); }
#else
@Override
public int getMaxSectionY() { return this.parent.getMaxSectionY(); }
#endif
@Override
public boolean isOutsideBuildHeight(BlockPos blockPos) { return this.parent.isOutsideBuildHeight(blockPos); }
@Override
public boolean isOutsideBuildHeight(int i) { return this.parent.isOutsideBuildHeight(i); }
@Override
public int getSectionIndex(int i) { return this.parent.getSectionIndex(i); }
@Override
public int getSectionIndexFromSectionY(int i) { return this.parent.getSectionIndexFromSectionY(i); }
@Override
public int getSectionYFromSectionIndex(int i) { return this.parent.getSectionYFromSectionIndex(i); }
#endif
}
@@ -0,0 +1,158 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.block;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.util.ColorUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.*;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.lighting.LevelLightEngine;
import net.minecraft.world.level.material.FluidState;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
#if MC_VER >= MC_1_18_2
import net.minecraft.core.Holder;
#endif
public class TintWithoutLevelOverrider implements BlockAndTintGetter
{
/**
* This will only ever be null if there was an issue with {@link IClientLevelWrapper#getPlainsBiomeWrapper()}
* but {@link Nullable} is there just in case.
*/
@Nullable
private final Biome biome;
public TintWithoutLevelOverrider(BiomeWrapper biomeWrapper, IClientLevelWrapper clientLevelWrapper)
{
// try to get the wrapped biome
Biome unwrappedBiome = null;
if (biomeWrapper.biome != null)
{
unwrappedBiome = unwrap(biomeWrapper.biome);
}
if(unwrappedBiome == null)
{
// we are looking at the empty biome wrapper, try using plains as a backup
BiomeWrapper plainsBiomeWrapper = ((BiomeWrapper) clientLevelWrapper.getPlainsBiomeWrapper());
if (plainsBiomeWrapper != null)
{
unwrappedBiome = unwrap(plainsBiomeWrapper.biome);
}
}
this.biome = unwrappedBiome;
}
@Override
public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver)
{
if (this.biome != null)
{
return colorResolver.getColor(this.biome, blockPos.getX(), blockPos.getZ());
}
else
{
// hopefully unneeded debug color
return ColorUtil.CYAN;
}
}
private static Biome unwrap(#if MC_VER >= MC_1_18_2 Holder<Biome> #else Biome #endif biome)
{
#if MC_VER >= MC_1_18_2
return biome.value();
#else
return biome;
#endif
}
//================//
// unused methods //
//================//
@Override
public float getShade(@NotNull Direction direction, boolean shade)
{
throw new UnsupportedOperationException("ERROR: getShade() called on TintWithoutLevelOverrider. Object is for tinting only.");
}
@Override
public @NotNull LevelLightEngine getLightEngine()
{
throw new UnsupportedOperationException("ERROR: getLightEngine() called on TintWithoutLevelOverrider. Object is for tinting only.");
}
@Nullable
@Override
public BlockEntity getBlockEntity(@NotNull BlockPos pos)
{
throw new UnsupportedOperationException("ERROR: getBlockEntity() called on TintWithoutLevelOverrider. Object is for tinting only.");
}
@Override
public @NotNull BlockState getBlockState(@NotNull BlockPos pos)
{
throw new UnsupportedOperationException("ERROR: getBlockState() called on TintWithoutLevelOverrider. Object is for tinting only.");
}
@Override
public @NotNull FluidState getFluidState(@NotNull BlockPos pos)
{
throw new UnsupportedOperationException("ERROR: getFluidState() called on TintWithoutLevelOverrider. Object is for tinting only.");
}
//==============//
// post MC 1.17 //
//==============//
#if MC_VER >= MC_1_17_1
@Override
public int getHeight()
{ throw new UnsupportedOperationException("ERROR: getHeight() called on TintWithoutLevelOverrider. Object is for tinting only."); }
#if MC_VER < MC_1_21_3
@Override
public int getMinBuildHeight()
{ throw new UnsupportedOperationException("ERROR: getMinBuildHeight() called on TintWithoutLevelOverrider. Object is for tinting only."); }
#else
@Override
public int getMinY()
{ throw new UnsupportedOperationException("ERROR: getMinY() called on TintWithoutLevelOverrider. Object is for tinting only."); }
#endif
#endif
}
@@ -0,0 +1,144 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.block;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.ColorResolver;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.lighting.LevelLightEngine;
import net.minecraft.world.level.material.FluidState;
import org.jetbrains.annotations.Nullable;
#if MC_VER >= MC_1_18_2
import net.minecraft.core.Holder;
#endif
public class TintWithoutLevelSmoothOverrider implements BlockAndTintGetter
{
final BiomeWrapper biome;
public int smoothingRange;
//=============//
// constructor //
//=============//
public TintWithoutLevelSmoothOverrider(BiomeWrapper biome, int smoothingRange)
{
this.biome = biome;
this.smoothingRange = smoothingRange;
}
//=========//
// methods //
//=========//
@Override
public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver)
{
return colorResolver.getColor(_unwrap(biome.biome), blockPos.getX(), blockPos.getZ());
}
private Biome _unwrap(#if MC_VER >= MC_1_18_2 Holder<Biome> #else Biome #endif biome)
{
#if MC_VER >= MC_1_18_2
return biome.value();
#else
return biome;
#endif
}
// public int calculateBlockTint(BlockPos blockPos, ColorResolver colorResolver)
// {
// int i = smoothingRange;
// if (i == 0)
// return colorResolver.getColor(_getBiome(blockPos), blockPos.getX(), blockPos.getZ());
// int j = (i * 2 + 1) * (i * 2 + 1);
// int k = 0;
// int l = 0;
// int m = 0;
// Cursor3D cursor3D = new Cursor3D(blockPos.getX() - i, blockPos.getY(), blockPos.getZ() - i, blockPos.getX() + i, blockPos.getY(), blockPos.getZ() + i);
// BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
// while (cursor3D.advance())
// {
// mutableBlockPos.set(cursor3D.nextX(), cursor3D.nextY(), cursor3D.nextZ());
// 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;
// l += (n & 0xFF00) >> 8;
// m += n & 0xFF;
// }
// return (k / j & 0xFF) << 16 | (l / j & 0xFF) << 8 | m / j & 0xFF;
// }
@Override
public float getShade(Direction direction, boolean shade)
{ throw new UnsupportedOperationException("ERROR: getShade() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); }
@Override
public LevelLightEngine getLightEngine()
{ throw new UnsupportedOperationException("ERROR: getLightEngine() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); }
@Nullable
@Override
public BlockEntity getBlockEntity(BlockPos pos)
{ throw new UnsupportedOperationException("ERROR: getBlockEntity() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); }
@Override
public BlockState getBlockState(BlockPos pos)
{ throw new UnsupportedOperationException("ERROR: getBlockState() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); }
@Override
public FluidState getFluidState(BlockPos pos)
{ throw new UnsupportedOperationException("ERROR: getFluidState() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); }
//==============//
// post MC 1.17 //
//==============//
#if MC_VER >= MC_1_17_1
@Override
public int getHeight()
{ throw new UnsupportedOperationException("ERROR: getHeight() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); }
#if MC_VER < MC_1_21_3
@Override
public int getMinBuildHeight()
{ throw new UnsupportedOperationException("ERROR: getMinBuildHeight() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); }
#else
@Override
public int getMinY()
{ throw new UnsupportedOperationException("ERROR: getMinY() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); }
#endif
#endif
}
@@ -0,0 +1,647 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.chunk;
import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
import com.seibel.distanthorizons.common.wrappers.misc.MutableBlockPosWrapper;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IMutableBlockPosWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ProtoChunk;
import net.minecraft.world.level.levelgen.Heightmap;
import org.apache.logging.log4j.Logger;
import java.util.*;
#if MC_VER >= MC_1_17_1
import net.minecraft.core.QuartPos;
#endif
#if MC_VER == MC_1_16_5
import net.minecraft.world.level.chunk.LevelChunkSection;
#endif
#if MC_VER == MC_1_17_1
import net.minecraft.world.level.chunk.LevelChunkSection;
#endif
#if MC_VER == MC_1_18_2
import net.minecraft.world.level.chunk.LevelChunkSection;
#endif
#if MC_VER == MC_1_19_2 || MC_VER == MC_1_19_4
import net.minecraft.world.level.chunk.LevelChunkSection;
#endif
#if MC_VER >= MC_1_20_1
import net.minecraft.world.level.chunk.LevelChunkSection;
#endif
#if MC_VER <= MC_1_20_4
import net.minecraft.world.level.chunk.ChunkStatus;
#else
import net.minecraft.world.level.chunk.status.ChunkStatus;
#endif
public class ChunkWrapper implements IChunkWrapper
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
/** can be used for interactions with the underlying chunk where creating new BlockPos objects could cause issues for the garbage collector. */
private static final ThreadLocal<BlockPos.MutableBlockPos> MUTABLE_BLOCK_POS_REF = ThreadLocal.withInitial(() -> new BlockPos.MutableBlockPos());
private static final ThreadLocal<MutableBlockPosWrapper> MUTABLE_BLOCK_POS_WRAPPER_REF = ThreadLocal.withInitial(() -> new MutableBlockPosWrapper());
private final ChunkAccess chunk;
private final DhChunkPos chunkPos;
private final ILevelWrapper wrappedLevel;
private boolean isDhBlockLightCorrect = false;
private boolean isDhSkyLightCorrect = false;
private ChunkLightStorage blockLightStorage;
private ChunkLightStorage skyLightStorage;
private ArrayList<DhBlockPos> blockLightPosList = null;
private int minNonEmptyHeight = Integer.MIN_VALUE;
private int maxNonEmptyHeight = Integer.MAX_VALUE;
/** will be null if we are using MC heightmaps */
private final int[][] solidHeightMap;
/** will be null if we are using MC heightmaps */
private final int[][] lightBlockingHeightMap;
//=============//
// constructor //
//=============//
public ChunkWrapper(ChunkAccess chunk, ILevelWrapper wrappedLevel)
{
this.chunk = chunk;
this.wrappedLevel = wrappedLevel;
this.chunkPos = new DhChunkPos(chunk.getPos().x, chunk.getPos().z);
// use DH heightmaps if requested
if (Config.Common.LodBuilding.recalculateChunkHeightmaps.get())
{
this.solidHeightMap = new int[LodUtil.CHUNK_WIDTH][LodUtil.CHUNK_WIDTH];
this.lightBlockingHeightMap = new int[LodUtil.CHUNK_WIDTH][LodUtil.CHUNK_WIDTH];
this.recalculateDhHeightMapsIfNeeded();
}
else
{
this.solidHeightMap = null;
this.lightBlockingHeightMap = null;
}
}
//=========//
// getters //
//=========//
@Override
public int getHeight() { return getHeight(this.chunk); }
public static int getHeight(ChunkAccess chunk)
{
#if MC_VER < MC_1_17_1
return 255;
#else
return chunk.getHeight();
#endif
}
@Override
public int getInclusiveMinBuildHeight() { return getInclusiveMinBuildHeight(this.chunk); }
public static int getInclusiveMinBuildHeight(ChunkAccess chunk)
{
#if MC_VER < MC_1_17_1
return 0;
#elif MC_VER < MC_1_21_3
return chunk.getMinBuildHeight();
#else
return chunk.getMinY();
#endif
}
@Override
public int getExclusiveMaxBuildHeight() { return getExclusiveMaxBuildHeight(this.chunk); }
public static int getExclusiveMaxBuildHeight(ChunkAccess chunk)
{
#if MC_VER < MC_1_21_3
return chunk.getMaxBuildHeight();
#else
// +1 since Minecraft made the max value inclusive
return chunk.getMaxY() + 1;
#endif
}
@Override
public int getMinNonEmptyHeight()
{
if (this.minNonEmptyHeight != Integer.MIN_VALUE)
{
return this.minNonEmptyHeight;
}
// default if every section is empty or missing
this.minNonEmptyHeight = this.getInclusiveMinBuildHeight();
// determine the lowest empty section (bottom up)
LevelChunkSection[] sections = this.chunk.getSections();
for (int index = 0; index < sections.length; index++)
{
if (sections[index] == null)
{
continue;
}
if (!isChunkSectionEmpty(sections[index]))
{
this.minNonEmptyHeight = this.getChunkSectionMinHeight(index);
break;
}
}
return this.minNonEmptyHeight;
}
@Override
public int getMaxNonEmptyHeight()
{
if (this.maxNonEmptyHeight != Integer.MAX_VALUE)
{
return this.maxNonEmptyHeight;
}
// default if every section is empty or missing
this.maxNonEmptyHeight = this.getExclusiveMaxBuildHeight();
// determine the highest empty section (top down)
LevelChunkSection[] sections = this.chunk.getSections();
for (int index = sections.length-1; index >= 0; index--)
{
// update at each position to fix using the max height if the chunk is empty
this.maxNonEmptyHeight = this.getChunkSectionMinHeight(index) + 16;
if (sections[index] == null)
{
continue;
}
if (!isChunkSectionEmpty(sections[index]))
{
// non-empty section found
break;
}
}
return this.maxNonEmptyHeight;
}
private static boolean isChunkSectionEmpty(LevelChunkSection section)
{
#if MC_VER == MC_1_16_5
return section.isEmpty();
#elif MC_VER == MC_1_17_1
return section.isEmpty();
#else
return section.hasOnlyAir();
#endif
}
private int getChunkSectionMinHeight(int index) { return (index * 16) + this.getInclusiveMinBuildHeight(); }
/** Will only run if the config says the MC heightmaps shouldn't be trusted. */
public void recalculateDhHeightMapsIfNeeded()
{
// re-calculate the min/max heights for consistency (during world gen these may be wrong)
this.minNonEmptyHeight = Integer.MIN_VALUE;
this.maxNonEmptyHeight = Integer.MAX_VALUE;
// recalculate heightmaps if needed
if (this.solidHeightMap != null)
{
for (int x = 0; x < LodUtil.CHUNK_WIDTH; x++)
{
for (int z = 0; z < LodUtil.CHUNK_WIDTH; z++)
{
int minInclusiveBuildHeight = this.getMinNonEmptyHeight();
// if no blocks are found the height map will be at the bottom of the world
int solidHeight = minInclusiveBuildHeight;
int lightBlockingHeight = minInclusiveBuildHeight;
int y = this.getMaxNonEmptyHeight(); //this.getExclusiveMaxBuildHeight();
IBlockStateWrapper block = this.getBlockState(x, y, z);
while (// go down until we reach the minimum build height
y > minInclusiveBuildHeight
// keep going until we find both height map values
&& (solidHeight == minInclusiveBuildHeight || lightBlockingHeight == minInclusiveBuildHeight))
{
// is this block solid?
if (solidHeight == minInclusiveBuildHeight
&& block.isSolid())
{
solidHeight = y;
}
// is this block light blocking?
if (lightBlockingHeight == minInclusiveBuildHeight
&& block.getOpacity() != LodUtil.BLOCK_FULLY_TRANSPARENT)
{
lightBlockingHeight = y;
}
// get the next block down
y--;
block = this.getBlockState(x, y, z);
}
this.solidHeightMap[x][z] = solidHeight;
this.lightBlockingHeightMap[x][z] = lightBlockingHeight;
}
}
}
}
@Override
public int getSolidHeightMapValue(int xRel, int zRel)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(xRel, zRel);
// will be null if we want to use MC heightmaps
if (this.solidHeightMap == null)
{
return this.chunk.getOrCreateHeightmapUnprimed(Heightmap.Types.WORLD_SURFACE).getFirstAvailable(xRel, zRel);
}
else
{
return this.solidHeightMap[xRel][zRel];
}
}
@Override
public int getLightBlockingHeightMapValue(int xRel, int zRel)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(xRel, zRel);
if (this.lightBlockingHeightMap == null)
{
return this.chunk.getOrCreateHeightmapUnprimed(Heightmap.Types.MOTION_BLOCKING).getFirstAvailable(xRel, zRel);
}
else
{
return this.lightBlockingHeightMap[xRel][zRel];
}
}
@Override
public IBiomeWrapper getBiome(int relX, int relY, int relZ)
{
#if MC_VER < MC_1_17_1
return BiomeWrapper.getBiomeWrapper(this.chunk.getBiomes().getNoiseBiome(
relX >> 2, relY >> 2, relZ >> 2),
this.wrappedLevel);
#elif MC_VER < MC_1_18_2
return BiomeWrapper.getBiomeWrapper(this.chunk.getBiomes().getNoiseBiome(
QuartPos.fromBlock(relX), QuartPos.fromBlock(relY), QuartPos.fromBlock(relZ)),
this.wrappedLevel);
#elif MC_VER < MC_1_18_2
return BiomeWrapper.getBiomeWrapper(this.chunk.getNoiseBiome(
QuartPos.fromBlock(relX), QuartPos.fromBlock(relY), QuartPos.fromBlock(relZ)),
this.wrappedLevel);
#else
//Now returns a Holder<Biome> instead of Biome
return BiomeWrapper.getBiomeWrapper(this.chunk.getNoiseBiome(
QuartPos.fromBlock(relX), QuartPos.fromBlock(relY), QuartPos.fromBlock(relZ)),
this.wrappedLevel);
#endif
}
@Override
public IBlockStateWrapper getBlockState(int relX, int relY, int relZ)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, relY, relZ);
BlockPos.MutableBlockPos blockPos = MUTABLE_BLOCK_POS_REF.get();
blockPos.setX(relX);
blockPos.setY(relY);
blockPos.setZ(relZ);
// TODO copy into pooled array, this isn't thread safe and can cause MC to throw errors if the chunk is loaded
return BlockStateWrapper.fromBlockState(this.chunk.getBlockState(blockPos), this.wrappedLevel);
}
@Override
public IBlockStateWrapper getBlockState(int relX, int relY, int relZ, IMutableBlockPosWrapper mcBlockPos, IBlockStateWrapper guess)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, relY, relZ);
BlockPos.MutableBlockPos pos = (BlockPos.MutableBlockPos)mcBlockPos.getWrappedMcObject();
pos.setX(relX);
pos.setY(relY);
pos.setZ(relZ);
return BlockStateWrapper.fromBlockState(this.chunk.getBlockState(pos), this.wrappedLevel, guess);
}
/**
// Commented out experimental LevelChunkSection cloning logic to fix extremely rare concurrency modification issue
// James has only ever seen a report relating to LevelSection concurrent modification once,
// the issue can cause DH lighting/LOD building to fail due to the chunk being modified on the server.
// James has only heard of this issue once, so it isn't a high priority issue.
// And from James' quick look at a few different MC versions it appears the LevelChunkSection object changes quite drastically between MC versions,
// meaning any cloning logic would have to either be a new wrapper or very MC version dependent, either way a lot of additional work.
// Due to the large time cost and extremely rare nature of the issue, this logic is commented out unless this issue pops up again in the future.
// instance variable to hold the cloned sections
private final LevelChunkSection[] levelChunkSections;
// new constructor logic to clone the sections
public constructor(...)
{
// other constructor logic //
LevelChunkSection[] sections = this.chunk.getSections();
this.levelChunkSections = new LevelChunkSection[sections.length];
for (int i = 0; i < sections.length; i++)
{
LevelChunkSection section = sections[i];
if (section != null)
{
// TODO implement section cloning for older MC versions, only 1.21.4 MC (and maybe other semi recent versions) have a clean way to handle this
// TODO we probably want a wrapper object instead
#if MC_VER < MC_1_21_4
this.levelChunkSections[i] = section;
#else
this.levelChunkSections[i] = section.copy();
#endif
}
}
}
// replacement getters
@Override
public IBlockStateWrapper getBlockState(int relX, int relY, int relZ)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, relY, relZ);
return this.getBlockStateInternal(relX, relY, relZ, null);
}
@Override
public IBlockStateWrapper getBlockState(int relX, int relY, int relZ, IMutableBlockPosWrapper mcBlockPos, IBlockStateWrapper guess)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, relY, relZ);
return this.getBlockStateInternal(relX, relY, relZ, guess);
}
// internal getter logic
private IBlockStateWrapper getBlockStateInternal(int relX, int y, int relZ, @Nullable IBlockStateWrapper guess)
{
try
{
// attempt to get the section for this position
int i = (y - this.getInclusiveMinBuildHeight()) / 16;
if (i >= 0 && i < this.levelChunkSections.length)
{
LevelChunkSection section = this.levelChunkSections[i];
if (!section.hasOnlyAir())
{
if (guess != null)
{
return BlockStateWrapper.fromBlockState(section.getBlockState(relX & 15, y & 15, relZ & 15), this.wrappedLevel, guess);
}
else
{
return BlockStateWrapper.fromBlockState(section.getBlockState(relX & 15, y & 15, relZ & 15), this.wrappedLevel);
}
}
}
return BlockStateWrapper.AIR;
}
catch (Exception e)
{
return BlockStateWrapper.AIR;
}
}
*/
@Override
public IMutableBlockPosWrapper getMutableBlockPosWrapper() { return MUTABLE_BLOCK_POS_WRAPPER_REF.get(); }
@Override
public DhChunkPos getChunkPos() { return this.chunkPos; }
public ChunkAccess getChunk() { return this.chunk; }
public void trySetStatus(ChunkStatus status) { trySetStatus(this.getChunk(), status); }
/** does nothing if the chunk object doesn't support setting it's status */
public static void trySetStatus(ChunkAccess chunk, ChunkStatus status)
{
if (chunk instanceof ProtoChunk)
{
#if MC_VER < MC_1_21_1
((ProtoChunk) chunk).setStatus(status);
#else
((ProtoChunk) chunk).setPersistedStatus(status);
#endif
}
}
public ChunkStatus getStatus() { return getStatus(this.getChunk()); }
public static ChunkStatus getStatus(ChunkAccess chunk)
{
#if MC_VER < MC_1_21_1
return chunk.getStatus();
#else
return chunk.getPersistedStatus();
#endif
}
@Override
public int getMaxBlockX() { return this.chunk.getPos().getMaxBlockX(); }
@Override
public int getMaxBlockZ() { return this.chunk.getPos().getMaxBlockZ(); }
@Override
public int getMinBlockX() { return this.chunk.getPos().getMinBlockX(); }
@Override
public int getMinBlockZ() { return this.chunk.getPos().getMinBlockZ(); }
//==========//
// lighting //
//==========//
@Override
public void setIsDhSkyLightCorrect(boolean isDhLightCorrect) { this.isDhSkyLightCorrect = isDhLightCorrect; }
@Override
public void setIsDhBlockLightCorrect(boolean isDhLightCorrect) { this.isDhBlockLightCorrect = isDhLightCorrect; }
@Override
public boolean isDhBlockLightingCorrect() { return this.isDhBlockLightCorrect; }
@Override
public boolean isDhSkyLightCorrect() { return this.isDhSkyLightCorrect; }
@Override
public int getDhBlockLight(int relX, int y, int relZ)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
return this.getBlockLightStorage().get(relX, y, relZ);
}
@Override
public void setDhBlockLight(int relX, int y, int relZ, int lightValue)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
this.getBlockLightStorage().set(relX, y, relZ, lightValue);
}
private ChunkLightStorage getBlockLightStorage()
{
if (this.blockLightStorage == null)
{
this.blockLightStorage = ChunkLightStorage.createBlockLightStorage(this);
}
return this.blockLightStorage;
}
public void setBlockLightStorage(ChunkLightStorage lightStorage) { this.blockLightStorage = lightStorage; }
@Override
public void clearDhBlockLighting() { this.getBlockLightStorage().clear(); }
@Override
public int getDhSkyLight(int relX, int y, int relZ)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
return this.getSkyLightStorage().get(relX, y, relZ);
}
@Override
public void setDhSkyLight(int relX, int y, int relZ, int lightValue)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
this.getSkyLightStorage().set(relX, y, relZ, lightValue);
}
@Override
public void clearDhSkyLighting() { this.getSkyLightStorage().clear(); }
private ChunkLightStorage getSkyLightStorage()
{
if (this.skyLightStorage == null)
{
this.skyLightStorage = ChunkLightStorage.createSkyLightStorage(this);
}
return this.skyLightStorage;
}
public void setSkyLightStorage(ChunkLightStorage lightStorage) { this.skyLightStorage = lightStorage; }
/**
* FIXME synchronized is necessary for a rare issue where this method is called from two separate threads at the same time
* before the list has finished populating.
*/
@Override
public synchronized ArrayList<DhBlockPos> getWorldBlockLightPosList()
{
// only populate the list once
if (this.blockLightPosList == null)
{
this.blockLightPosList = new ArrayList<>();
#if MC_VER < MC_1_20_1
this.chunk.getLights().forEach((blockPos) ->
{
this.blockLightPosList.add(new DhBlockPos(blockPos.getX(), blockPos.getY(), blockPos.getZ()));
});
#else
this.chunk.findBlockLightSources((blockPos, blockState) ->
{
DhBlockPos pos = new DhBlockPos(blockPos.getX(), blockPos.getY(), blockPos.getZ());
// this can be uncommented if MC decides to return relative block positions in the future instead of world positions
//pos.mutateToChunkRelativePos(pos);
//pos.mutateOffset(this.chunkPos.getMinBlockX(), 0, this.chunkPos.getMinBlockZ(), pos);
this.blockLightPosList.add(pos);
});
#endif
}
return this.blockLightPosList;
}
//===============//
// other methods //
//===============//
@Override
public boolean isStillValid() { return this.wrappedLevel.tryGetChunk(this.chunkPos) == this; }
//================//
// base overrides //
//================//
@Override
public String toString() { return this.chunk.getClass().getSimpleName() + this.chunk.getPos(); }
//@Override
//public int hashCode()
//{
// if (this.blockBiomeHashCode == 0)
// {
// this.blockBiomeHashCode = this.getBlockBiomeHashCode();
// }
//
// return this.blockBiomeHashCode;
//}
}
@@ -0,0 +1,709 @@
package com.seibel.distanthorizons.common.wrappers.gui;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
// Logger (for debug stuff)
import com.seibel.distanthorizons.api.enums.config.DisallowSelectingViaConfigGui;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.config.ConfigBase;
import com.seibel.distanthorizons.core.config.types.*;
import com.seibel.distanthorizons.common.wrappers.gui.updater.ChangelogScreen;
// Uses https://github.com/TheElectronWill/night-config for toml (only for Fabric since Forge already includes this)
// Gets info from our own mod
// Minecraft imports
import com.seibel.distanthorizons.core.jar.updater.SelfUpdater;
import com.seibel.distanthorizons.core.util.AnnotationUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.config.IConfigGui;
import com.seibel.distanthorizons.coreapi.ModInfo;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
#if MC_VER < MC_1_20_1
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.GuiComponent;
#else
import net.minecraft.client.gui.GuiGraphics;
#endif
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.ContainerObjectSelectionList;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.client.resources.language.I18n; // translation
#if MC_VER >= MC_1_17_1
import net.minecraft.client.gui.narration.NarratableEntry;
#endif
import net.minecraft.resources.ResourceLocation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.*;
/**
* Based upon TinyConfig but is highly modified
* https://github.com/Minenash/TinyConfig
*
* Credits to Motschen
*
* @author coolGi
* @version 5-21-2022
*/
// FLOATS DONT WORK WITH THIS
/** This file is going to be removed sometime soon, please dont hook onto anything within this file until the new UI is compleated */
@SuppressWarnings("unchecked")
public class ClassicConfigGUI
{
/*
This would be removed later on as it is going to be re-written in java swing
*/
private static final Logger LOGGER = LogManager.getLogger();
public static final ConfigCoreInterface CONFIG_CORE_INTERFACE = new ConfigCoreInterface();
//==============//
// Initializers //
//==============//
// Some regexes to check if an input is valid
private static final Pattern INTEGER_ONLY_REGEX = Pattern.compile("(-?[0-9]*)");
private static final Pattern DECIMAL_ONLY_REGEX = Pattern.compile("-?([\\d]+\\.?[\\d]*|[\\d]*\\.?[\\d]+|\\.)");
private static class ConfigScreenConfigs
{
// This contains all the configs for the configs
public static final int SpaceFromRightScreen = 10;
public static final int ButtonWidthSpacing = 5;
public static final int ResetButtonWidth = 40;
public static final int ResetButtonHeight = 20;
}
/**
* The terribly coded old stuff
*/
public static class EntryInfo
{
Object widget;
Map.Entry<EditBox, Component> error;
String tempValue;
int index;
}
/**
* creates a text field
*/
private static void textField(AbstractConfigType info, Function<String, Number> func, Pattern pattern, boolean cast)
{
((EntryInfo) info.guiValue).widget = (BiFunction<EditBox, Button, Predicate<String>>) (editBox, button) -> stringValue ->
{
boolean isNumber = (pattern != null);
stringValue = stringValue.trim();
if (!(stringValue.isEmpty() || !isNumber || pattern.matcher(stringValue).matches()))
{
return false;
}
Number value = info.typeIsFloatingPointNumber() ? 0.0 : 0; // different default values are needed so implicit casting works correctly (if not done casting from 0 (an int) to a double will cause an exception)
((EntryInfo) info.guiValue).error = null;
if (isNumber && !stringValue.isEmpty() && !stringValue.equals("-") && !stringValue.equals("."))
{
try
{
value = func.apply(stringValue);
}
catch (Exception e)
{
value = null;
}
byte isValid = ((ConfigEntry) info).isValid(value);
switch (isValid)
{
case 0:
((EntryInfo) info.guiValue).error = null;
break;
case -1:
((EntryInfo) info.guiValue).error = new AbstractMap.SimpleEntry<>(editBox, TextOrTranslatable("§cMinimum length is " + ((ConfigEntry) info).getMin()));
break;
case 1:
((EntryInfo) info.guiValue).error = new AbstractMap.SimpleEntry<>(editBox, TextOrTranslatable("§cMaximum length is " + ((ConfigEntry) info).getMax()));
break;
case 2:
((EntryInfo) info.guiValue).error = new AbstractMap.SimpleEntry<>(editBox, TextOrTranslatable("§cValue is invalid"));
break;
}
}
((EntryInfo) info.guiValue).tempValue = stringValue;
editBox.setTextColor(((ConfigEntry) info).isValid(value) == 0 ? 0xFFFFFFFF : 0xFFFF7777); // white and red
// button.active = entries.stream().allMatch(e -> e.inLimits);
if (info.getType() == String.class
|| info.getType() == List.class)
{
((ConfigEntry) info).uiSetWithoutSaving(stringValue);
}
else if (((ConfigEntry) info).isValid(value) == 0)
{
if (!cast)
{
((ConfigEntry) info).uiSetWithoutSaving(value);
}
else
{
((ConfigEntry) info).uiSetWithoutSaving(value.intValue());
}
}
return true;
};
}
//==============//
// GUI handling //
//==============//
/**
* if you want to get this config gui's screen call this
*/
public static Screen getScreen(ConfigBase configBase, Screen parent, String category)
{
return new ConfigScreen(configBase, parent, category);
}
/**
* Pain
*/
private static class ConfigScreen extends DhScreen
{
protected ConfigScreen(ConfigBase configBase, Screen parent, String category)
{
super(Translatable(
I18n.exists(configBase.modID + ".config" + (category.isEmpty() ? "." + category : "") + ".title") ?
configBase.modID + ".config.title" :
configBase.modID + ".config" + (category.isEmpty() ? "" : "." + category) + ".title")
);
this.configBase = configBase;
this.parent = parent;
this.category = category;
this.translationPrefix = configBase.modID + ".config.";
}
private final ConfigBase configBase;
private final String translationPrefix;
private final Screen parent;
private final String category;
private ConfigListWidget list;
private boolean reload = false;
private Button doneButton;
// Real Time config update //
@Override
public void tick()
{
super.tick();
}
/**
* When you close it, it goes to the previous screen and saves
*/
@Override
public void onClose()
{
ConfigBase.INSTANCE.configFileINSTANCE.saveToFile();
Objects.requireNonNull(this.minecraft).setScreen(this.parent);
CONFIG_CORE_INTERFACE.onScreenChangeListenerList.forEach((listener) -> listener.run());
}
@Override
protected void init()
{
super.init();
if (!reload)
{
ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile();
}
// Changelog button
if (Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() && !ModInfo.IS_DEV_BUILD) // we only have changelogs for stable builds
{
this.addBtn(new TexturedButtonWidget(
// Where the button is on the screen
this.width - 28, this.height - 28,
// Width and height of the button
20, 20,
// texture UV Offset
0, 0,
// Some textuary stuff
0,
#if MC_VER < MC_1_21_1
new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"),
#else
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/changelog.png"),
#endif
20, 20,
// Create the button and tell it where to go
(buttonWidget) -> {
ChangelogScreen changelogScreen = new ChangelogScreen(this);
if (changelogScreen.usable)
Objects.requireNonNull(minecraft).setScreen(changelogScreen);
else
LOGGER.warn("Changelog was not able to open");
},
// Add a title to the button
Translatable(ModInfo.ID + ".updater.title")
));
}
addBtn(MakeBtn(Translatable("distanthorizons.general.cancel"),
this.width / 2 - 154, this.height - 28,
150, 20,
button ->
{
ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile();
Objects.requireNonNull(minecraft).setScreen(parent);
}));
doneButton = addBtn(MakeBtn(Translatable("distanthorizons.general.done"), this.width / 2 + 4, this.height - 28, 150, 20, (button) -> {
ConfigBase.INSTANCE.configFileINSTANCE.saveToFile();
Objects.requireNonNull(minecraft).setScreen(parent);
}));
this.list = new ConfigListWidget(this.minecraft, this.width * 2, this.height, 32, 32, 25);
#if MC_VER < MC_1_20_6 // no background is rendered in MC 1.20.6+
if (this.minecraft != null && this.minecraft.level != null)
this.list.setRenderBackground(false);
#endif
this.addWidget(this.list);
for (AbstractConfigType info : ConfigBase.INSTANCE.entries)
{
try
{
if (info.getCategory().matches(category) && info.getAppearance().showInGui)
addMenuItem(info);
}
catch (Exception e)
{
String message = "ERROR: Failed to show [\" + info.getNameWCategory() + \"], error: ["+e.getMessage()+"]";
if (info.get() != null)
{
message += " with the value [" + info.get() + "] with type [" + info.getType() + "]";
}
LOGGER.error(message, e);
}
}
CONFIG_CORE_INTERFACE.onScreenChangeListenerList.forEach((listener) -> listener.run());
}
private void addMenuItem(AbstractConfigType info)
{
initEntry(info, this.translationPrefix);
Component name = Translatable(translationPrefix + info.getNameWCategory());
if (ConfigEntry.class.isAssignableFrom(info.getClass()))
{
Button.OnPress btnAction = button -> {
((ConfigEntry) info).uiSetWithoutSaving(((ConfigEntry) info).getDefaultValue());
((EntryInfo) info.guiValue).index = 0;
this.reload = true;
Objects.requireNonNull(minecraft).setScreen(this);
};
int posX = this.width - ConfigScreenConfigs.SpaceFromRightScreen - 150 - ConfigScreenConfigs.ButtonWidthSpacing - ConfigScreenConfigs.ResetButtonWidth;
int posZ = 0;
Button resetButton = MakeBtn(Translatable("distanthorizons.general.reset").withStyle(ChatFormatting.RED),
posX, posZ, ConfigScreenConfigs.ResetButtonWidth, ConfigScreenConfigs.ResetButtonHeight,
btnAction);
if (((EntryInfo) info.guiValue).widget instanceof Map.Entry)
{
Map.Entry<Button.OnPress, Function<Object, Component>> widget = (Map.Entry<Button.OnPress, Function<Object, Component>>) ((EntryInfo) info.guiValue).widget;
if (info.getType().isEnum())
{
widget.setValue(value -> Translatable(translationPrefix + "enum." + info.getType().getSimpleName() + "." + info.get().toString()));
}
this.list.addButton(MakeBtn(widget.getValue().apply(info.get()), this.width - 150 - ConfigScreenConfigs.SpaceFromRightScreen, 0, 150, 20, widget.getKey()), resetButton, null, name);
return;
}
else if (((EntryInfo) info.guiValue).widget != null)
{
EditBox widget = new EditBox(font, this.width - 150 - ConfigScreenConfigs.SpaceFromRightScreen + 2, 0, 150 - 4, 20, null);
widget.setMaxLength(150);
widget.insertText(String.valueOf(info.get()));
Predicate<String> processor = ((BiFunction<EditBox, Button, Predicate<String>>) ((EntryInfo) info.guiValue).widget).apply(widget, doneButton);
widget.setFilter(processor);
this.list.addButton(widget, resetButton, null, name);
return;
}
}
if (ConfigCategory.class.isAssignableFrom(info.getClass()))
{
Button widget = MakeBtn(name, this.width / 2 - 100, this.height - 28, 100 * 2, 20, (button -> {
ConfigBase.INSTANCE.configFileINSTANCE.saveToFile();
Objects.requireNonNull(minecraft).setScreen(ClassicConfigGUI.getScreen(this.configBase, this, ((ConfigCategory) info).getDestination()));
}));
this.list.addButton(widget, null, null, null);
return;
}
if (ConfigUIButton.class.isAssignableFrom(info.getClass()))
{
Button widget = MakeBtn(name, this.width / 2 - 100, this.height - 28, 100 * 2, 20, (button -> {
((ConfigUIButton) info).runAction();
}));
this.list.addButton(widget, null, null, null);
return;
}
if (ConfigUIComment.class.isAssignableFrom(info.getClass()))
{
this.list.addButton(null, null, null, name);
return;
}
if (ConfigUiLinkedEntry.class.isAssignableFrom(info.getClass()))
{
this.addMenuItem(((ConfigUiLinkedEntry) info).get());
return;
}
LOGGER.warn("Config [" + info.getNameWCategory() + "] failed to show. Please try something like changing its type.");
}
@Override
#if MC_VER < MC_1_20_1
public void render(PoseStack matrices, int mouseX, int mouseY, float delta)
#else
public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta)
#endif
{
#if MC_VER < MC_1_20_2 // 1.20.2 now enables this by default in the `this.list.render` function
this.renderBackground(matrices); // Renders background
#else
super.render(matrices, mouseX, mouseY, delta);
#endif
this.list.render(matrices, mouseX, mouseY, delta); // Render buttons
DhDrawCenteredString(matrices, font, title, width / 2, 15, 0xFFFFFF); // Render title
if (this.configBase.modID.equals("distanthorizons"))
{
// Display version
DhDrawString(matrices, font, TextOrLiteral(ModInfo.VERSION), 2, height - 10, 0xAAAAAA);
// If the update is pending, display this message to inform the user that it will apply when the game restarts
if (SelfUpdater.deleteOldJarOnJvmShutdown)
DhDrawString(matrices, font, Translatable(configBase.modID + ".updater.waitingForClose"), 4, height - 38, 0xFFFFFF);
}
// Render the tooltip only if it can find a tooltip in the language file
for (AbstractConfigType info : ConfigBase.INSTANCE.entries)
{
if (info.getCategory().matches(category) && info.getAppearance().showInGui)
{
if (list.getHoveredButton(mouseX, mouseY).isPresent())
{
AbstractWidget buttonWidget = list.getHoveredButton(mouseX, mouseY).get();
Component text = ButtonEntry.buttonsWithText.get(buttonWidget);
if (text == null)
{
continue;
}
// A quick fix for tooltips on linked entries
AbstractConfigType newInfo = ConfigUiLinkedEntry.class.isAssignableFrom(info.getClass()) ?
((ConfigUiLinkedEntry) info).get() :
info;
Component name = Translatable(this.translationPrefix + (info.category.isEmpty() ? "" : info.category + ".") + info.getName());
String key = translationPrefix + (newInfo.category.isEmpty() ? "" : newInfo.category + ".") + newInfo.getName() + ".@tooltip";
if (((EntryInfo) newInfo.guiValue).error != null && text.equals(name))
{
DhRenderTooltip(matrices, font, ((EntryInfo) newInfo.guiValue).error.getValue(), mouseX, mouseY);
}
else if (I18n.exists(key) && (text != null && text.equals(name)))
{
List<Component> list = new ArrayList<>();
for (String str : I18n.get(key).split("\n"))
{
list.add(TextOrTranslatable(str));
}
DhRenderComponentTooltip(matrices, font, list, mouseX, mouseY);
}
}
}
}
#if MC_VER < MC_1_20_2
super.render(matrices, mouseX, mouseY, delta);
#endif
}
}
private static void initEntry(AbstractConfigType configType, String translationPrefix)
{
configType.guiValue = new EntryInfo();
Class<?> fieldClass = configType.getType();
if (ConfigEntry.class.isAssignableFrom(configType.getClass()))
{
if (fieldClass == Integer.class)
{
// For int
textField(configType, Integer::parseInt, INTEGER_ONLY_REGEX, true);
}
else if (fieldClass == Double.class)
{
// For double
textField(configType, Double::parseDouble, DECIMAL_ONLY_REGEX, false);
}
else if (fieldClass == String.class || fieldClass == List.class)
{
// For string or list
textField(configType, String::length, null, true);
}
else if (fieldClass == Boolean.class)
{
// For boolean
Function<Object, Component> func = value -> Translatable("distanthorizons.general."+((Boolean) value ? "true" : "false")).withStyle((Boolean) value ? ChatFormatting.GREEN : ChatFormatting.RED);
((EntryInfo) configType.guiValue).widget = new AbstractMap.SimpleEntry<Button.OnPress, Function<Object, Component>>(button -> {
((ConfigEntry) configType).uiSetWithoutSaving(!(Boolean) configType.get());
button.setMessage(func.apply(configType.get()));
}, func);
}
else if (fieldClass.isEnum())
{
// For enum
List<?> values = Arrays.asList(configType.getType().getEnumConstants());
Function<Object, Component> func = value -> Translatable(translationPrefix + "enum." + fieldClass.getSimpleName() + "." + configType.get().toString());
((EntryInfo) configType.guiValue).widget = new AbstractMap.SimpleEntry<Button.OnPress, Function<Object, Component>>(button -> {
// get the currently selected enum and enum index
int startingIndex = values.indexOf(configType.get());
Enum<?> enumValue = (Enum<?>) values.get(startingIndex);
// search for the next enum that is selectable
int index = startingIndex + 1;
index = (index >= values.size()) ? 0 : index;
while (index != startingIndex)
{
enumValue = (Enum<?>) values.get(index);
if (!AnnotationUtil.doesEnumHaveAnnotation(enumValue, DisallowSelectingViaConfigGui.class))
{
// this enum shouldn't be selectable via the UI,
// skip it
break;
}
index++;
index = (index >= values.size()) ? 0 : index;
}
if (index == startingIndex)
{
// none of the enums should be selectable, this is a programmer error
enumValue = (Enum<?>) values.get(startingIndex);
LOGGER.warn("Enum [" + enumValue.getClass() + "] doesn't contain any values that should be selectable via the UI, sticking to the currently selected value [" + enumValue + "].");
}
((ConfigEntry<Enum<?>>) configType).uiSetWithoutSaving(enumValue);
button.setMessage(func.apply(configType.get()));
}, func);
}
}
else if (ConfigCategory.class.isAssignableFrom(configType.getClass()))
{
// if (!info.info.getName().equals(""))
// info.name = new TranslatableComponent(info.info.getName());
}
// return info;
}
public static class ConfigListWidget extends ContainerObjectSelectionList<ButtonEntry>
{
Font textRenderer;
public ConfigListWidget(Minecraft minecraftClient, int canvasWidth, int canvasHeight, int topMargin, int botMargin, int itemSpacing)
{
#if MC_VER < MC_1_20_4
super(minecraftClient, canvasWidth, canvasHeight, topMargin, canvasHeight - botMargin, itemSpacing);
#else
super(minecraftClient, canvasWidth, canvasHeight - (topMargin + botMargin), topMargin, itemSpacing);
#endif
this.centerListVertically = false;
textRenderer = minecraftClient.font;
}
public void addButton(AbstractWidget button, AbstractWidget resetButton, AbstractWidget indexButton, Component text)
{
this.addEntry(ButtonEntry.create(button, text, resetButton, indexButton));
}
@Override
public int getRowWidth()
{
return 10000;
}
public Optional<AbstractWidget> getHoveredButton(double mouseX, double mouseY)
{
for (ButtonEntry buttonEntry : this.children())
{
if (buttonEntry.button != null && buttonEntry.button.isMouseOver(mouseX, mouseY))
{
return Optional.of(buttonEntry.button);
}
}
return Optional.empty();
}
}
public static class ButtonEntry extends ContainerObjectSelectionList.Entry<ButtonEntry>
{
private static final Font textRenderer = Minecraft.getInstance().font;
public final AbstractWidget button;
private final AbstractWidget resetButton;
private final AbstractWidget indexButton;
private final Component text;
private final List<AbstractWidget> children = new ArrayList<>();
public static final Map<AbstractWidget, Component> buttonsWithText = new HashMap<>();
private ButtonEntry(AbstractWidget button, Component text, AbstractWidget resetButton, AbstractWidget indexButton)
{
buttonsWithText.put(button, text);
this.button = button;
this.resetButton = resetButton;
this.text = text;
this.indexButton = indexButton;
if (button != null)
children.add(button);
if (resetButton != null)
children.add(resetButton);
if (indexButton != null)
children.add(indexButton);
}
public static ButtonEntry create(AbstractWidget button, Component text, AbstractWidget resetButton, AbstractWidget indexButton)
{
return new ButtonEntry(button, text, resetButton, indexButton);
}
@Override
#if MC_VER < MC_1_20_1
public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta)
#else
public void render(GuiGraphics matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta)
#endif
{
if (button != null)
{
SetY(button, y);
button.render(matrices, mouseX, mouseY, tickDelta);
}
if (resetButton != null)
{
SetY(resetButton, y);
resetButton.render(matrices, mouseX, mouseY, tickDelta);
}
if (indexButton != null)
{
SetY(indexButton, y);
indexButton.render(matrices, mouseX, mouseY, tickDelta);
}
if (text != null && (!text.getString().contains("spacer") || button != null))
#if MC_VER < MC_1_20_1
GuiComponent.drawString(matrices, textRenderer, text, 12, y + 5, 0xFFFFFF);
#else
matrices.drawString(textRenderer, text, 12, y + 5, 0xFFFFFF);
#endif
}
@Override
public List<? extends GuiEventListener> children()
{
return children;
}
// Only for 1.17 and over
// Remove in 1.16 and below
#if MC_VER >= MC_1_17_1
@Override
public List<? extends NarratableEntry> narratables()
{
return children;
}
#endif
}
//================//
// event handling //
//================//
private static class ConfigCoreInterface implements IConfigGui
{
/**
* in the future it would be good to pass in the current page and other variables,
* but for now just knowing when the page is closed is good enough
*/
public final ArrayList<Runnable> onScreenChangeListenerList = new ArrayList<>();
@Override
public void addOnScreenChangeListener(Runnable newListener) { this.onScreenChangeListenerList.add(newListener); }
@Override
public void removeOnScreenChangeListener(Runnable oldListener) { this.onScreenChangeListenerList.remove(oldListener); }
}
}
@@ -0,0 +1,77 @@
package com.seibel.distanthorizons.common.wrappers.gui;
import net.minecraft.client.gui.Font;
#if MC_VER < MC_1_20_1
import com.mojang.blaze3d.vertex.PoseStack;
#else
import net.minecraft.client.gui.GuiGraphics;
#endif
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import java.util.List;
public class DhScreen extends Screen
{
protected DhScreen(Component $$0)
{
super($$0);
}
// addRenderableWidget in 1.17 and over
// addButton in 1.16 and below
protected Button addBtn(Button button)
{
#if MC_VER < MC_1_17_1
return this.addButton(button);
#else
return this.addRenderableWidget(button);
#endif
}
#if MC_VER < MC_1_20_1
protected void DhDrawCenteredString(PoseStack guiStack, Font font, Component text, int x, int y, int color)
{
drawCenteredString(guiStack, font, text, x, y, color);
}
protected void DhDrawString(PoseStack guiStack, Font font, Component text, int x, int y, int color)
{
drawString(guiStack, font, text, x, y, color);
}
protected void DhRenderTooltip(PoseStack guiStack, Font font, List<? extends net.minecraft.util.FormattedCharSequence> text, int x, int y)
{
renderTooltip(guiStack, text, x, y);
}
protected void DhRenderComponentTooltip(PoseStack guiStack, Font font, List<Component> comp, int x, int y)
{
renderComponentTooltip(guiStack, comp, x, y);
}
protected void DhRenderTooltip(PoseStack guiStack, Font font, Component comp, int x, int y)
{
renderTooltip(guiStack, comp, x, y);
}
#else
protected void DhDrawCenteredString(GuiGraphics guiStack, Font font, Component text, int x, int y, int color)
{
guiStack.drawCenteredString(font, text, x, y, color);
}
protected void DhDrawString(GuiGraphics guiStack, Font font, Component text, int x, int y, int color)
{
guiStack.drawString(font, text, x, y, color);
}
protected void DhRenderTooltip(GuiGraphics guiStack, Font font, List<? extends net.minecraft.util.FormattedCharSequence> text, int x, int y)
{
guiStack.renderTooltip(font, text, x, y);
}
protected void DhRenderComponentTooltip(GuiGraphics guiStack, Font font, List<Component> comp, int x, int y)
{
guiStack.renderComponentTooltip(font, comp, x, y);
}
protected void DhRenderTooltip(GuiGraphics guiStack, Font font, Component text, int x, int y)
{
guiStack.renderTooltip(font, text, x, y);
}
#endif
}
@@ -0,0 +1,43 @@
package com.seibel.distanthorizons.common.wrappers.gui;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.config.ConfigBase;
import com.seibel.distanthorizons.core.config.gui.ConfigScreen;
import com.seibel.distanthorizons.core.config.gui.JavaScreenHandlerScreen;
import com.seibel.distanthorizons.core.config.gui.OpenGLConfigScreen;
import net.minecraft.client.gui.screens.Screen;
public class GetConfigScreen
{
public static type useScreen = type.Classic;
public enum type
{
Classic,
@Deprecated
OpenGL, // This was just an attempt, it didn't work out, and we are going to change to javafx soon (as soon as that works)
JavaFX;
}
public static Screen getScreen(Screen parent)
{
// Generate the language
// This shouldn't be here, but I need a way to test it after Minecraft inits its assets
//System.out.println(ConfigBase.INSTANCE.generateLang(false, true));
switch (useScreen)
{
case Classic:
return ClassicConfigGUI.getScreen(ConfigBase.INSTANCE, parent, "client");
case OpenGL:
MinecraftScreen.getScreen(parent, new OpenGLConfigScreen(), ModInfo.ID + ".title");
return null;
// case JavaFX -> MinecraftScreen.getScreen(parent, new JavaScreenHandlerScreen(new JavaScreenHandlerScreen.ExampleScreen()), ModInfo.ID + ".title");
case JavaFX:
return MinecraftScreen.getScreen(parent, new JavaScreenHandlerScreen(new ConfigScreen()), ModInfo.ID + ".title");
default:
throw new IllegalArgumentException("No config screen implementation defined for ["+useScreen+"].");
}
}
}
@@ -0,0 +1,72 @@
package com.seibel.distanthorizons.common.wrappers.gui;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Button;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
#if MC_VER < MC_1_19_2
import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent;
#endif
public class GuiHelper
{
/**
* Helper static methods for versional compat
*/
public static Button MakeBtn(Component base, int posX, int posZ, int width, int height, Button.OnPress action)
{
#if MC_VER < MC_1_19_4
return new Button(posX, posZ, width, height, base, action);
#else
return Button.builder(base, action).bounds(posX, posZ, width, height).build();
#endif
}
public static MutableComponent TextOrLiteral(String text)
{
#if MC_VER < MC_1_19_2
return new TextComponent(text);
#else
return Component.literal(text);
#endif
}
public static MutableComponent TextOrTranslatable(String text)
{
#if MC_VER < MC_1_19_2
return new TextComponent(text);
#else
return Component.translatable(text);
#endif
}
public static MutableComponent Translatable(String text, Object... args)
{
#if MC_VER < MC_1_19_2
return new TranslatableComponent(text, args);
#else
return Component.translatable(text, args);
#endif
}
public static void SetX(AbstractWidget w, int x)
{
#if MC_VER < MC_1_19_4
w.x = x;
#else
w.setX(x);
#endif
}
public static void SetY(AbstractWidget w, int y)
{
#if MC_VER < MC_1_19_4
w.y = y;
#else
w.setY(y);
#endif
}
}
@@ -0,0 +1,21 @@
package com.seibel.distanthorizons.common.wrappers.gui;
import com.seibel.distanthorizons.core.wrapperInterfaces.config.ILangWrapper;
import net.minecraft.client.resources.language.I18n;
public class LangWrapper implements ILangWrapper
{
public static final LangWrapper INSTANCE = new LangWrapper();
@Override
public boolean langExists(String str)
{
return I18n.exists(str);
}
@Override
public String getLang(String str)
{
return I18n.get(str);
}
}
@@ -0,0 +1,150 @@
package com.seibel.distanthorizons.common.wrappers.gui;
import com.mojang.blaze3d.platform.Window;
import com.mojang.blaze3d.vertex.PoseStack;
import com.seibel.distanthorizons.core.config.gui.AbstractScreen;
import net.minecraft.client.Minecraft;
#if MC_VER >= MC_1_20_1
import net.minecraft.client.gui.GuiGraphics;
#endif
import net.minecraft.client.gui.components.ContainerObjectSelectionList;
import net.minecraft.client.gui.screens.Screen;
import org.jetbrains.annotations.NotNull;
import java.nio.file.Path;
import java.util.*;
public class MinecraftScreen
{
public static Screen getScreen(Screen parent, AbstractScreen screen, String translationName)
{
return new ConfigScreenRenderer(parent, screen, translationName);
}
private static class ConfigScreenRenderer extends DhScreen
{
private final Screen parent;
private ConfigListWidget list;
private AbstractScreen screen;
#if MC_VER < MC_1_19_2
public static net.minecraft.network.chat.TranslatableComponent translate(String str, Object... args)
{
return new net.minecraft.network.chat.TranslatableComponent(str, args);
}
#else
public static net.minecraft.network.chat.MutableComponent translate(String str, Object... args)
{
return net.minecraft.network.chat.Component.translatable(str, args);
}
#endif
protected ConfigScreenRenderer(Screen parent, AbstractScreen screen, String translationName)
{
super(translate(translationName));
screen.minecraftWindow = Minecraft.getInstance().getWindow().getWindow();
this.parent = parent;
this.screen = screen;
}
@Override
protected void init()
{
super.init(); // Init Minecraft's screen
Window mcWindow = this.minecraft.getWindow();
screen.width = mcWindow.getWidth();
screen.height = mcWindow.getHeight();
screen.scaledWidth = this.width;
screen.scaledHeight = this.height;
screen.init(); // Init our own config screen
this.list = new ConfigListWidget(this.minecraft, this.width, this.height, 0, 0, 25); // Select the area to tint
#if MC_VER < MC_1_20_6 // no background is rendered in MC 1.20.6+
if (this.minecraft != null && this.minecraft.level != null) // Check if in game
this.list.setRenderBackground(false); // Disable from rendering
#endif
this.addWidget(this.list); // Add the tint to the things to be rendered
}
@Override
#if MC_VER < MC_1_20_1
public void render(PoseStack matrices, int mouseX, int mouseY, float delta)
#else
public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta)
#endif
{
#if MC_VER < MC_1_20_2
this.renderBackground(matrices); // Render background
#else
this.renderBackground(matrices, mouseX, mouseY, delta); // Render background
#endif
this.list.render(matrices, mouseX, mouseY, delta); // Renders the items in the render list (currently only used to tint background darker)
screen.mouseX = mouseX;
screen.mouseY = mouseY;
screen.render(delta); // Render everything on the main screen
super.render(matrices, mouseX, mouseY, delta); // Render the vanilla stuff (currently only used for the background and tint)
}
@Override
public void resize(Minecraft mc, int width, int height)
{
super.resize(mc, width, height); // Resize Minecraft's screen
Window mcWindow = this.minecraft.getWindow();
screen.width = mcWindow.getWidth();
screen.height = mcWindow.getHeight();
screen.scaledWidth = this.width;
screen.scaledHeight = this.height;
screen.onResize(); // Resize our screen
}
@Override
public void tick()
{
super.tick(); // Tick Minecraft's screen
screen.tick(); // Tick our screen
if (screen.close) // If we decide to close the screen, then actually close the screen
onClose();
}
@Override
public void onClose()
{
screen.onClose(); // Close our screen
Objects.requireNonNull(minecraft).setScreen(this.parent); // Goto the parent screen
}
@Override
public void onFilesDrop(@NotNull List<Path> files)
{
screen.onFilesDrop(files);
}
// For checking if it should close when you press the escape key
@Override
public boolean shouldCloseOnEsc()
{
return screen.shouldCloseOnEsc;
}
}
public static class ConfigListWidget extends ContainerObjectSelectionList
{
public ConfigListWidget(Minecraft minecraftClient, int canvasWidth, int canvasHeight, int topMargin, int botMargin, int itemSpacing)
{
#if MC_VER < MC_1_20_4
super(minecraftClient, canvasWidth, canvasHeight, topMargin, canvasHeight - botMargin, itemSpacing);
#else
super(minecraftClient, canvasWidth, canvasHeight - (topMargin + botMargin), topMargin, itemSpacing);
#endif
this.centerListVertically = false;
}
}
}
@@ -0,0 +1,211 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.gui;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
#if MC_VER >= MC_1_17_1
import net.minecraft.client.gui.components.Button;
#endif
#if MC_VER < MC_1_17_1
import net.minecraft.client.gui.components.ImageButton;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
#elif MC_VER < MC_1_20_1
import net.minecraft.client.gui.components.ImageButton;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.renderer.GameRenderer;
#elif MC_VER < MC_1_20_2
import net.minecraft.client.gui.components.ImageButton;
import net.minecraft.client.gui.GuiGraphics;
#else
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.RenderType;
#endif
/**
* Creates a button with a texture on it (and a background) that works with all mc versions
*
* @author coolGi
* @version 2023-10-03
*/
#if MC_VER < MC_1_20_2
public class TexturedButtonWidget extends ImageButton
#else
public class TexturedButtonWidget extends Button
#endif
{
public final boolean renderBackground;
#if MC_VER >= MC_1_20_2
private final int u;
private final int v;
private final int hoveredVOffset;
private final ResourceLocation textureResourceLocation;
private final int textureWidth;
private final int textureHeight;
#endif
public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation textureResourceLocation, int textureWidth, int textureHeight, OnPress pressAction, Component text)
{
this(x, y, width, height, u, v, hoveredVOffset, textureResourceLocation, textureWidth, textureHeight, pressAction, text, true);
}
public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation textureResourceLocation, int textureWidth, int textureHeight, OnPress pressAction, Component text, boolean renderBackground)
{
#if MC_VER < MC_1_20_2
super(x, y, width, height, u, v, hoveredVOffset, textureResourceLocation, textureWidth, textureHeight, pressAction, text);
#else
// We don't pass on the text option as otherwise it will render (we normally pass it for narration)
// TODO: Find a fix for it
super(x, y, width, height, Component.empty(), pressAction, DEFAULT_NARRATION);
this.u = u;
this.v = v;
this.hoveredVOffset = hoveredVOffset;
this.textureResourceLocation = textureResourceLocation;
this.textureWidth = textureWidth;
this.textureHeight = textureHeight;
#endif
this.renderBackground = renderBackground;
}
#if MC_VER < MC_1_20_2
#if MC_VER < MC_1_19_4
@Override
public void renderButton(PoseStack matrices, int mouseX, int mouseY, float delta)
{
if (this.renderBackground) // Renders the background of the button
{
#if MC_VER < 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.setShaderTexture(0, WIDGETS_LOCATION);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha);
#endif
int i = this.getYImage(this.isHovered);
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.enableDepthTest();
#if MC_VER < MC_1_19_4
this.blit(matrices, this.x, this.y, 0, 46 + i * 20, this.width / 2, this.height);
this.blit(matrices, this.x + this.width / 2, this.y, 200 - this.width / 2, 46 + i * 20, this.width / 2, this.height);
#else
this.blit(matrices, this.getX(), this.getY(), 0, 46 + i * 20, this.getWidth() / 2, this.getHeight());
this.blit(matrices, this.getX() + this.getWidth() / 2, this.getY(), 200 - this.width / 2, 46 + i * 20, this.getWidth() / 2, this.getHeight());
#endif
}
super.renderButton(matrices, mouseX, mouseY, delta);
}
#else
#if MC_VER < MC_1_20_1
@Override
public void renderWidget(PoseStack matrices, int mouseX, int mouseY, float delta)
{
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderTexture(0, WIDGETS_LOCATION);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha);
#else
@Override
public void renderWidget(GuiGraphics matrices, int mouseX, int mouseY, float delta)
{
#endif
if (this.renderBackground) // Renders the background of the button
{
int i = 1;
if (!this.active) i = 0;
else if (this.isHovered) i = 2;
#if MC_VER < MC_1_20_1
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.enableDepthTest();
this.blit(matrices, this.getX(), this.getY(), 0, 46 + i * 20, this.getWidth() / 2, this.getHeight());
this.blit(matrices, this.getX() + this.getWidth() / 2, this.getY(), 200 - this.width / 2, 46 + i * 20, this.getWidth() / 2, this.getHeight());
#else
matrices.blit(WIDGETS_LOCATION, this.getX(), this.getY(), 0, 46 + i * 20, this.getWidth() / 2, this.getHeight());
matrices.blit(WIDGETS_LOCATION, this.getX() + this.getWidth() / 2, this.getY(), 200 - this.width / 2, 46 + i * 20, this.getWidth() / 2, this.getHeight());
#endif
}
super.renderWidget(matrices, mouseX, mouseY, delta);
}
#endif
#else
@Override
public void renderWidget(GuiGraphics matrices, int mouseX, int mouseY, float delta)
{
if (this.renderBackground)
{
#if MC_VER < MC_1_21_3
matrices.blitSprite(SPRITES.get(this.active, this.isHoveredOrFocused()), this.getX(), this.getY(), this.getWidth(), this.getHeight());
#else
matrices.blitSprite(
RenderType::guiTextured,
SPRITES.get(this.active, this.isHoveredOrFocused()),
this.getX(), this.getY(),
this.getWidth(), this.getHeight());
#endif
}
// Renders the sprite
int i = 0;
if (!this.active)
{
i = 2;
}
else if (this.isHovered)
{
i = 1;
}
#if MC_VER < MC_1_21_3
matrices.blit(this.textureResourceLocation, this.getX(), this.getY(), this.u, this.v + (this.hoveredVOffset * i), this.width, this.height, this.textureWidth, this.textureHeight);
#else
matrices.blit(
RenderType::guiTextured,
this.textureResourceLocation,
this.getX(), this.getY(),
this.u, this.v + (this.hoveredVOffset * i),
this.width, this.height,
this.textureWidth, this.textureHeight);
#endif
}
#endif
}
@@ -0,0 +1,290 @@
package com.seibel.distanthorizons.common.wrappers.gui.updater;
import com.seibel.distanthorizons.common.wrappers.gui.DhScreen;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.jar.installer.MarkdownFormatter;
import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.ContainerObjectSelectionList;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import org.apache.logging.log4j.Logger;
#if MC_VER >= MC_1_17_1
import net.minecraft.client.gui.narration.NarratableEntry;
#endif
#if MC_VER < MC_1_20_1
import net.minecraft.client.gui.GuiComponent;
import com.mojang.blaze3d.vertex.PoseStack;
#else
import net.minecraft.client.gui.GuiGraphics;
#endif
import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.*;
import java.util.*;
/**
* The screen that pops up if the mod has an update.
*
* @author coolGi
*/
// TODO: After finishing the config, rewrite this in openGL as well
// TODO: Make this
public class ChangelogScreen extends DhScreen
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private Screen parent;
private String versionID;
private List<String> changelog;
private TextArea changelogArea;
public boolean usable = false;
public ChangelogScreen(Screen parent)
{
this(parent, null);
if (!ModrinthGetter.initted) // Make sure the modrinth stuff is initted
{
ModrinthGetter.init();
}
if (!ModrinthGetter.initted) // If its not initted, then this isnt usable
{
return;
}
if (!ModrinthGetter.mcVersions.contains(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()))
{
return;
}
String versionID = ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion());
if (versionID == null)
{
return;
}
try
{
this.setupChangelog(versionID);
this.usable = true;
}
catch (Exception e)
{
LOGGER.error("failed to setup changelog, error: ["+e.getMessage()+"].", e);
}
}
public ChangelogScreen(Screen parent, String versionID)
{
super(Translatable(ModInfo.ID + ".updater.title"));
this.parent = parent;
this.versionID = versionID;
if (versionID == null)
{
return;
}
try
{
this.setupChangelog(versionID);
this.usable = true;
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void setupChangelog(String versionID)
{
this.changelog = new ArrayList<>();
// Put the new version name at the very top of the change log
this.changelog.add("§lChangelog for " + ModrinthGetter.releaseNames.get(versionID) + "§r");
this.changelog.add("");
this.changelog.add("");
String changelog = ModrinthGetter.changeLogs.get(versionID);
if (changelog == null)
{
// in case something goes wrong this will prevent null pointers
changelog = "";
}
// Get the release changelog and split it by the new lines
String[] unwrappedChangelog = // Arrays.asList could be used if a list object is desired here vs List.of which is only available for Java 9+
// This formats markdown to minecraft's "§" charactersnew MarkdownFormatter.MinecraftFormat().convertTo(
new MarkdownFormatter.MinecraftFormat().convertTo(changelog).split("\\n");
// Makes the words wrap around to not go off the screen
for (String str : unwrappedChangelog)
{
this.changelog.addAll(
MarkdownFormatter.splitString(str, 75)
);
}
// Debugging
// System.out.println(this.changelog);
}
@Override
protected void init()
{
super.init();
if (!this.usable)
{
return;
}
this.addBtn( // Close
MakeBtn(Translatable(ModInfo.ID + ".general.back"), 5, this.height - 25, 100, 20, (btn) -> {
this.onClose();
})
);
this.changelogArea = new TextArea(this.minecraft, this.width * 2, this.height, 32, 32, 10);
for (int i = 0; i < this.changelog.size(); i++)
{
this.changelogArea.addButton(TextOrLiteral(this.changelog.get(i)));
// drawString(matrices, this.font, changelog.get(i), this.width / 2 - 175, this.height / 2 - 100 + i*10, 0xFFFFFF);
}
}
@Override
#if MC_VER < MC_1_20_1
public void render(PoseStack matrices, int mouseX, int mouseY, float delta)
#else
public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta)
#endif
{
#if MC_VER < MC_1_20_2
this.renderBackground(matrices); // Render background
#else
this.renderBackground(matrices, mouseX, mouseY, delta); // Render background
#endif
if (!this.usable)
{
return;
}
int maxScroll;
#if MC_VER <= MC_1_21_3
maxScroll = this.changelogArea.getMaxScroll();
#else
maxScroll = this.changelogArea.maxScrollAmount();
#endif
// Set the scroll position to the mouse height relative to the screen
// This is a bit of a hack as we cannot scroll on this area
double scrollAmount = ((double) mouseY) / ((double) this.height) * 1.1 * maxScroll;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
this.changelogArea.setScrollAmount(scrollAmount);
#elif MC_VER <= MC_1_21_3
this.changelogArea.scrollAmount = scrollAmount;
#else
this.changelogArea.setScrollAmount(scrollAmount);
#endif
// render order matters, otherwise on 1.20.6+ the blurred background will render on top of the text
super.render(matrices, mouseX, mouseY, delta); // Render the buttons
this.changelogArea.render(matrices, mouseX, mouseY, delta); // Render the changelog
this.DhDrawCenteredString(matrices, this.font, this.title, this.width / 2, 15, 0xFFFFFF); // Render title
}
@Override
public void onClose()
{
Objects.requireNonNull(this.minecraft).setScreen(this.parent); // Goto the parent screen
}
public static class TextArea extends ContainerObjectSelectionList<ButtonEntry>
{
Font textRenderer;
public TextArea(Minecraft minecraftClient, int canvasWidth, int canvasHeight, int topMargin, int botMargin, int itemSpacing)
{
#if MC_VER < MC_1_20_4
super(minecraftClient, canvasWidth, canvasHeight, topMargin, canvasHeight - botMargin, itemSpacing);
#else
super(minecraftClient, canvasWidth, canvasHeight - (topMargin + botMargin), topMargin, itemSpacing);
#endif
this.centerListVertically = false;
this.textRenderer = minecraftClient.font;
}
public void addButton(Component text)
{
this.addEntry(ButtonEntry.create(text));
}
@Override
public int getRowWidth()
{
return 10000;
}
}
public static class ButtonEntry extends ContainerObjectSelectionList.Entry<ButtonEntry>
{
private static final Font textRenderer = Minecraft.getInstance().font;
private final Component text;
private final List<AbstractWidget> children = new ArrayList<>();
private ButtonEntry(Component text)
{
this.text = text;
}
public static ButtonEntry create(Component text)
{
return new ButtonEntry(text);
}
#if MC_VER < MC_1_20_1
@Override
public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta)
{
GuiComponent.drawString(matrices, textRenderer, text, 12, y + 5, 0xFFFFFF);
}
#else
@Override
public void render(GuiGraphics matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta)
{
matrices.drawString(textRenderer, this.text, 12, y + 5, 0xFFFFFF);
}
#endif
@Override
public List<? extends GuiEventListener> children()
{
return this.children;
}
#if MC_VER >= MC_1_17_1
@Override
public List<? extends NarratableEntry> narratables()
{
return this.children;
}
#endif
}
}
@@ -0,0 +1,193 @@
package com.seibel.distanthorizons.common.wrappers.gui.updater;
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
import com.seibel.distanthorizons.common.wrappers.gui.DhScreen;
import com.seibel.distanthorizons.common.wrappers.gui.TexturedButtonWidget;
import com.seibel.distanthorizons.core.jar.ModJarInfo;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter;
import com.seibel.distanthorizons.core.jar.updater.SelfUpdater;
#if MC_VER >= MC_1_20_1
import net.minecraft.client.gui.GuiGraphics;
#else
import com.mojang.blaze3d.vertex.PoseStack;
#endif
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.resources.ResourceLocation;
import org.apache.logging.log4j.Logger;
import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.*;
import java.util.*;
/**
* The screen that pops up if the mod has an update.
*
* @author coolGi
*/
// TODO: After finishing the config, rewrite this in Java Swing as well
// and also maybe add this suggestion https://discord.com/channels/881614130614767666/1035863487110467625/1035949054485594192
public class UpdateModScreen extends DhScreen
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private Screen parent;
private String newVersionID;
private String currentVer;
private String nextVer;
public UpdateModScreen(Screen parent, String newVersionID) throws IllegalArgumentException
{
super(Translatable(ModInfo.ID + ".updater.title"));
this.parent = parent;
this.newVersionID = newVersionID;
EDhApiUpdateBranch updateBranch = EDhApiUpdateBranch.convertAutoToStableOrNightly(Config.Client.Advanced.AutoUpdater.updateBranch.get());
if (updateBranch == EDhApiUpdateBranch.STABLE)
{
this.currentVer = ModInfo.VERSION;
this.nextVer = ModrinthGetter.releaseNames.get(this.newVersionID);
}
else
{
this.currentVer = ModJarInfo.Git_Commit.substring(0,7);
this.nextVer = this.newVersionID.substring(0,7);
}
// done to prevent trying to update to "null"
// (this can happen if no versions are available to check/download from modrinth/gitlab)
if (this.nextVer == null)
{
throw new IllegalArgumentException("No new version found with the ID ["+newVersionID+"].");
}
}
@Override
protected void init()
{
super.init();
try
{
// Logo image
this.addBtn(new TexturedButtonWidget(
// Where the button is on the screen
this.width / 2 - 95, this.height / 2 - 110,
// Width and height of the button
195, 65,
// Offset
0, 0,
// Some textuary stuff
0,
#if MC_VER < MC_1_21_1
new ResourceLocation(ModInfo.ID, "logo.png"),
#else
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "logo.png"),
#endif
195, 65,
// Create the button and tell it where to go
// For now it goes to the client option by default
(buttonWidget) -> System.out.println("Nice, you found an easter egg :)"), // TODO: Add a proper easter egg to pressing the logo (maybe with confetti)
// Add a title to the button
Translatable(ModInfo.ID + ".updater.title"),
// Dont render the background of the button
false
));
}
catch (Exception e)
{
LOGGER.error("Failed to setup update mod screen, error: ["+e.getMessage()+"].", e);
}
if (!ModInfo.IS_DEV_BUILD)
{
this.addBtn(new TexturedButtonWidget(
// Where the button is on the screen
this.width / 2 - 97, this.height / 2 + 8,
// Width and height of the button
20, 20,
// Offset
0, 0,
// Some textuary stuff
0,
#if MC_VER < MC_1_21_1
new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"),
#else
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/changelog.png"),
#endif
20, 20,
// Create the button and tell it where to go
(buttonWidget) -> Objects.requireNonNull(minecraft).setScreen(new ChangelogScreen(this, this.newVersionID)), // TODO: Add a proper easter egg to pressing the logo (maybe with confetti)
// Add a title to the button
Translatable(ModInfo.ID + ".updater.title")
));
}
this.addBtn( // Update
MakeBtn(Translatable(ModInfo.ID + ".updater.update"), this.width / 2 - 75, this.height / 2 + 8, 150, 20, (btn) -> {
SelfUpdater.updateMod();
this.onClose();
})
);
this.addBtn( // Silent update
MakeBtn(Translatable(ModInfo.ID + ".updater.silent"), this.width / 2 - 75, this.height / 2 + 30, 150, 20, (btn) -> {
Config.Client.Advanced.AutoUpdater.enableSilentUpdates.set(true);
SelfUpdater.updateMod();
this.onClose();
})
);
this.addBtn( // Later (not now)
MakeBtn(Translatable(ModInfo.ID + ".updater.later"), this.width / 2 + 2, this.height / 2 + 70, 100, 20, (btn) -> {
this.onClose();
})
);
this.addBtn( // Never
MakeBtn(Translatable(ModInfo.ID + ".updater.never"), this.width / 2 - 102, this.height / 2 + 70, 100, 20, (btn) -> {
Config.Client.Advanced.AutoUpdater.enableAutoUpdater.set(false);
this.onClose();
})
);
}
@Override
#if MC_VER < MC_1_20_1
public void render(PoseStack matrices, int mouseX, int mouseY, float delta)
#else
public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta)
#endif
{
#if MC_VER < MC_1_20_2
this.renderBackground(matrices); // Render background
#else
this.renderBackground(matrices, mouseX, mouseY, delta); // Render background
#endif
// TODO: add the tooltips for the buttons
super.render(matrices, mouseX, mouseY, delta); // Render the buttons
// TODO: Add tooltips
// Render the text's
DhDrawCenteredString(matrices, this.font, Translatable(ModInfo.ID + ".updater.text1"), this.width / 2, this.height / 2 - 35, 0xFFFFFF);
DhDrawCenteredString(matrices, this.font,
Translatable(ModInfo.ID + ".updater.text2", currentVer, nextVer),
this.width / 2, this.height / 2 - 20, 0x52FD52);
}
@Override
public void onClose()
{
Objects.requireNonNull(minecraft).setScreen(this.parent); // Goto the parent screen
}
}
@@ -0,0 +1,55 @@
package com.seibel.distanthorizons.common.wrappers.level;
import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel;
import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import net.minecraft.client.multiplayer.ClientLevel;
import org.jetbrains.annotations.Nullable;
public class KeyedClientLevelManager implements IKeyedClientLevelManager
{
public static final KeyedClientLevelManager INSTANCE = new KeyedClientLevelManager();
/** This is set and managed by the ClientApi for servers with support for DH. */
@Nullable
private IServerKeyedClientLevel serverKeyedLevel = null;
/** Allows to keep level manager enabled between loading different keyed levels */
private boolean enabled = false;
//=============//
// constructor //
//=============//
private KeyedClientLevelManager() { }
//======================//
// level override logic //
//======================//
@Override
@Nullable
public IServerKeyedClientLevel getServerKeyedLevel() { return this.serverKeyedLevel; }
@Override
public IServerKeyedClientLevel setServerKeyedLevel(IClientLevelWrapper clientLevel, String levelKey)
{
IServerKeyedClientLevel keyedLevel = new ServerKeyedClientLevel((ClientLevel) clientLevel.getWrappedMcObject(), levelKey);
this.serverKeyedLevel = keyedLevel;
this.enabled = true;
return keyedLevel;
}
@Override
public void clearKeyedLevel() { this.serverKeyedLevel = null; }
@Override
public boolean isEnabled() { return this.enabled; }
@Override
public void disable() { this.enabled = false; }
}
@@ -0,0 +1,30 @@
package com.seibel.distanthorizons.common.wrappers.level;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.coreapi.util.StringUtil;
import net.minecraft.client.multiplayer.ClientLevel;
public class ServerKeyedClientLevel extends ClientLevelWrapper implements IServerKeyedClientLevel
{
/** A unique identifier (generally the level's name) for differentiating multiverse levels */
private final String serverLevelKey;
public ServerKeyedClientLevel(ClientLevel level, String serverLevelKey)
{
super(level);
this.serverLevelKey = serverLevelKey;
}
@Override
public String getServerLevelKey() { return this.serverLevelKey; }
@Override
public String getDhIdentifier() { return this.getServerLevelKey(); }
}
@@ -0,0 +1,378 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.minecraft;
import java.io.File;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.Objects;
import java.util.UUID;
import com.mojang.blaze3d.platform.NativeImage;
import com.seibel.distanthorizons.api.enums.config.EDhApiLodShading;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.enums.EDhDirection;
import com.seibel.distanthorizons.core.file.structure.ClientOnlySaveStructure;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import net.minecraft.CrashReport;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
#if MC_VER < MC_1_19_2
import net.minecraft.network.chat.TextComponent;
#endif
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.level.ChunkPos;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;
#if MC_VER < MC_1_21_3
#else
import net.minecraft.util.profiling.Profiler;
#endif
/**
* A singleton that wraps the Minecraft object.
*
* @author James Seibel
*/
public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecraftSharedWrapper
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
private static final Minecraft MINECRAFT = Minecraft.getInstance();
public static final MinecraftClientWrapper INSTANCE = new MinecraftClientWrapper();
/**
* The lightmap for the current:
* Time, dimension, brightness setting, etc.
*/
private NativeImage lightMap = null;
private ProfilerWrapper profilerWrapper;
private MinecraftClientWrapper()
{
}
//================//
// helper methods //
//================//
/**
* This should be called at the beginning of every frame to
* clear any Minecraft data that becomes out of date after a frame. <br> <br>
* <p>
* LightMaps and other time sensitive objects fall in this category. <br> <br>
* <p>
* This doesn't affect OpenGL objects in any way.
*/
@Override
public void clearFrameObjectCache() { this.lightMap = null; }
//=================//
// method wrappers //
//=================//
@Override
public float getShade(EDhDirection lodDirection)
{
EDhApiLodShading lodShading = Config.Client.Advanced.Graphics.Quality.lodShading.get();
switch (lodShading)
{
default:
case AUTO:
if (MINECRAFT.level != null)
{
Direction mcDir = McObjectConverter.Convert(lodDirection);
return MINECRAFT.level.getShade(mcDir, true);
}
else
{
return 0.0f;
}
case ENABLED:
switch (lodDirection)
{
case DOWN:
return 0.5F;
default:
case UP:
return 1.0F;
case NORTH:
case SOUTH:
return 0.8F;
case WEST:
case EAST:
return 0.6F;
}
case DISABLED:
return 1.0F;
}
}
@Override
public boolean hasSinglePlayerServer() { return MINECRAFT.hasSingleplayerServer(); }
@Override
public boolean clientConnectedToDedicatedServer() { return MINECRAFT.getCurrentServer() != null && !this.hasSinglePlayerServer(); }
@Override
public boolean connectedToReplay() { return !MINECRAFT.hasSingleplayerServer() && MINECRAFT.getCurrentServer() == null; }
@Override
public String getCurrentServerName()
{
if (this.connectedToReplay())
{
return ClientOnlySaveStructure.REPLAY_SERVER_FOLDER_NAME;
}
else
{
ServerData server = MINECRAFT.getCurrentServer();
return (server != null) ? server.name : "NULL";
}
}
@Override
public String getCurrentServerIp()
{
if (this.connectedToReplay())
{
return "";
}
else
{
ServerData server = MINECRAFT.getCurrentServer();
return (server != null) ? server.ip : "NA";
}
}
@Override
public String getCurrentServerVersion()
{
ServerData server = MINECRAFT.getCurrentServer();
return (server != null) ? server.version.getString() : "UNKOWN";
}
//=============//
// Simple gets //
//=============//
public LocalPlayer getPlayer() { return MINECRAFT.player; }
@Override
public boolean playerExists() { return MINECRAFT.player != null; }
@Override
public UUID getPlayerUUID() { return this.getPlayer().getUUID(); }
@Override
public String getUsername() { return MINECRAFT.getUser().getName(); }
@Override
public DhBlockPos getPlayerBlockPos()
{
LocalPlayer player = this.getPlayer();
if (player == null)
{
return new DhBlockPos(0, 0, 0);
}
BlockPos playerPos = player.blockPosition();
return new DhBlockPos(playerPos.getX(), playerPos.getY(), playerPos.getZ());
}
@Override
public DhChunkPos getPlayerChunkPos()
{
LocalPlayer player = this.getPlayer();
if (player == null)
{
return new DhChunkPos(0, 0);
}
#if MC_VER < MC_1_17_1
ChunkPos playerPos = new ChunkPos(player.blockPosition());
#else
ChunkPos playerPos = player.chunkPosition();
#endif
return new DhChunkPos(playerPos.x, playerPos.z);
}
@Nullable
@Override
public IClientLevelWrapper getWrappedClientLevel() { return this.getWrappedClientLevel(false); }
@Override
@Nullable
public IClientLevelWrapper getWrappedClientLevel(boolean bypassLevelKeyManager)
{
ClientLevel level = MINECRAFT.level;
if (level == null)
{
return null;
}
return ClientLevelWrapper.getWrapper(level, bypassLevelKeyManager);
}
@Override
public IProfilerWrapper getProfiler()
{
ProfilerFiller profiler;
#if MC_VER < MC_1_21_3
profiler = MINECRAFT.getProfiler();
#else
profiler = Profiler.get();
#endif
if (this.profilerWrapper == null)
{
this.profilerWrapper = new ProfilerWrapper(profiler);
}
else if (profiler != this.profilerWrapper.profiler)
{
this.profilerWrapper.profiler = profiler;
}
return this.profilerWrapper;
}
/** Returns all worlds available to the server */
@Override
public ArrayList<ILevelWrapper> getAllServerWorlds()
{
ArrayList<ILevelWrapper> worlds = new ArrayList<ILevelWrapper>();
Iterable<ServerLevel> serverWorlds = MINECRAFT.getSingleplayerServer().getAllLevels();
for (ServerLevel world : serverWorlds)
{
worlds.add(ServerLevelWrapper.getWrapper(world));
}
return worlds;
}
@Override
public void sendChatMessage(String string)
{
LocalPlayer player = this.getPlayer();
if (player == null)
{
return;
}
#if MC_VER < MC_1_19_2
player.sendMessage(new TextComponent(string), getPlayer().getUUID());
#else
player.displayClientMessage(net.minecraft.network.chat.Component.translatable(string), /*isOverlay*/false);
#endif
}
@Override
public void sendOverlayMessage(String string)
{
LocalPlayer player = this.getPlayer();
if (player == null)
{
return;
}
#if MC_VER < MC_1_19_2
player.displayClientMessage(new TextComponent(string), /*isOverlay*/true);
#else
player.displayClientMessage(net.minecraft.network.chat.Component.translatable(string), /*isOverlay*/true);
#endif
}
/**
* Crashes Minecraft, displaying the given errorMessage <br> <br>
* In the following format: <br>
*
* The game crashed whilst <strong>errorMessage</strong> <br>
* Error: <strong>ExceptionClass: exceptionErrorMessage</strong> <br>
* Exit Code: -1 <br>
*/
@Override
public void crashMinecraft(String errorMessage, Throwable exception)
{
LOGGER.error(ModInfo.READABLE_NAME + " had the following error: [" + errorMessage + "]. Crashing Minecraft...", exception);
CrashReport report = new CrashReport(errorMessage, exception);
#if MC_VER < MC_1_20_4
Minecraft.crash(report);
#else
Minecraft.getInstance().delayCrash(report);
#endif
}
@Override
public Object getOptionsObject() { return MINECRAFT.options; }
@Override
public boolean isDedicatedServer() { return false; }
@Override
public File getInstallationDirectory() { return MINECRAFT.gameDirectory; }
@Override
public void executeOnRenderThread(Runnable runnable) { MINECRAFT.execute(runnable); }
@Override
public int getPlayerCount()
{
// can be null if the server hasn't finished booting up yet
if (MINECRAFT.getSingleplayerServer() == null)
{
return 1;
}
else
{
return MINECRAFT.getSingleplayerServer().getPlayerCount();
}
}
}
@@ -0,0 +1,245 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.minecraft;
import com.mojang.blaze3d.platform.GlStateManager;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL32;
/**
* <b>Why does DH often call GL methods twice? </b><br>
* Once using the base {@link GL32} function and a second time using
* Minecraft's {@link GlStateManager}?<br><br>
*
* <b>Answer: </b><br>
* Compatibility and robustness<br>
* In general all MC rendering should go through MC's {@link GlStateManager},
* however that isn't always the case.
* So, to prevent issues if a mod (or MC itself) calls a direct GL function
* instead of the {@link GlStateManager} wrapper, we need to be sure about what the actual
* set value is (whether setting or getting) and that MC knows what DH has done.
* This way whether a mod (or MC) is using the {@link GlStateManager} or direct GL calls,
* they should always have the correct value for anything DH has modified.
* <br><br>
* This may slow down some low end GPUs that are driver limited,
* however James would rather have slow correct rendering vs fast broken rendering.
*/
public class MinecraftGLWrapper implements IMinecraftGLWrapper
{
public static final MinecraftGLWrapper INSTANCE = new MinecraftGLWrapper();
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
/*
private static final StencilState STENCIL;
*/
// scissor //
/** @see GL32#GL_SCISSOR_TEST */
@Override
public void enableScissorTest()
{
GL32.glEnable(GL32.GL_SCISSOR_TEST);
GlStateManager._enableScissorTest();
}
/** @see GL32#GL_SCISSOR_TEST */
@Override
public void disableScissorTest()
{
GL32.glDisable(GL32.GL_SCISSOR_TEST);
GlStateManager._disableScissorTest();
}
// stencil //
//
// /** @see GL32#GL_SCISSOR_TEST */
// public void enableScissorTest() { GlStateManager._stencilFunc(); }
// /** @see GL32#GL_SCISSOR_TEST */
// public void disableScissorTest() { GlStateManager._disableScissorTest(); }
// depth //
/** @see GL32#GL_DEPTH_TEST */
@Override
public void enableDepthTest()
{
GL32.glEnable(GL32.GL_DEPTH_TEST);
GlStateManager._enableDepthTest();
}
/** @see GL32#GL_DEPTH_TEST */
@Override
public void disableDepthTest()
{
GL32.glDisable(GL32.GL_DEPTH_TEST);
GlStateManager._disableDepthTest();
}
/** @see GL32#glDepthFunc(int) */
@Override
public void glDepthFunc(int func)
{
GL32.glDepthFunc(func);
GlStateManager._depthFunc(func);
}
/** @see GL32#glDepthMask(boolean) */
@Override
public void enableDepthMask()
{
GL32.glDepthMask(true);
GlStateManager._depthMask(true);
}
/** @see GL32#glDepthMask(boolean) */
@Override
public void disableDepthMask()
{
GL32.glDepthMask(false);
GlStateManager._depthMask(false);
}
// blending //
/** @see GL32#GL_BLEND */
@Override
public void enableBlend()
{
GL32.glEnable(GL32.GL_BLEND);
GlStateManager._enableBlend();
}
/** @see GL32#GL_BLEND */
@Override
public void disableBlend()
{
GL32.glDisable(GL32.GL_BLEND);
GlStateManager._disableBlend();
}
/** @see GL32#glBlendFunc */
@Override
public void glBlendFunc(int sfactor, int dfactor)
{
GL32.glBlendFunc(sfactor, dfactor);
GlStateManager._blendFunc(sfactor, dfactor);
}
/** @see GL32#glBlendFuncSeparate */
@Override
public void glBlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha)
{
GL32.glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
GlStateManager._blendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
}
// frame buffers //
/** @see GL32#glBindFramebuffer */
@Override
public void glBindFramebuffer(int target, int framebuffer)
{
GL32.glBindFramebuffer(target, framebuffer);
GlStateManager._glBindFramebuffer(target, framebuffer);
}
// buffers //
/** @see GL32#glGenBuffers() */
@Override
public int glGenBuffers()
{ return GlStateManager._glGenBuffers(); }
/** @see GL32#glDeleteBuffers(int) */
@Override
public void glDeleteBuffers(int buffer)
{
GL32.glDeleteBuffers(buffer);
// MC's implementation has a bug where it will throw:
// GL_INVALID_OPERATION in glBufferData(immutable)
// when attempting to delete Storage Buffers
// So we need to manually delete the buffers ourselves
//GlStateManager._glDeleteBuffers(buffer);
}
// culling //
/** @see GL32#GL_CULL_FACE */
@Override
public void enableFaceCulling()
{
GL32.glEnable(GL32.GL_CULL_FACE);
GlStateManager._enableCull();
}
/** @see GL32#GL_CULL_FACE */
@Override
public void disableFaceCulling()
{
GL32.glDisable(GL32.GL_CULL_FACE);
GlStateManager._disableCull();
}
// textures //
/** @see GL32#glGenTextures() */
@Override
public int glGenTextures() { return GlStateManager._genTexture(); }
/** @see GL32#glDeleteTextures(int) */
@Override
public void glDeleteTextures(int texture) { GlStateManager._deleteTexture(texture); }
/** @see GL32#glActiveTexture(int) */
@Override
public void glActiveTexture(int textureId)
{
GL32.glActiveTexture(textureId);
GlStateManager._activeTexture(textureId);
}
@Override
public int getActiveTexture() { return GL32.glGetInteger(GL32.GL_ACTIVE_TEXTURE); }
/**
* Always binds to {@link GL32#GL_TEXTURE_2D}
* @see GL32#glBindTexture(int, int)
*/
@Override
public void glBindTexture(int texture)
{
GL32.glBindTexture(GL32.GL_TEXTURE_2D, texture);
GlStateManager._bindTexture(texture);
}
}
@@ -0,0 +1,330 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.minecraft;
import java.awt.Color;
import java.lang.invoke.MethodHandles;
import java.util.concurrent.ConcurrentHashMap;
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.NativeImage;
import com.seibel.distanthorizons.common.wrappers.WrapperFactory;
import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper;
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.util.ColorUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper;
#if MC_VER >= MC_1_17_1
import net.minecraft.client.renderer.FogRenderer;
import com.mojang.blaze3d.systems.RenderSystem;
#endif
#if MC_VER < MC_1_19_4
import org.joml.Matrix4f;
import org.joml.Vector3f;
#else
#endif
#if MC_VER >= MC_1_20_2
#endif
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.core.util.math.Vec3d;
import com.seibel.distanthorizons.core.util.math.Vec3f;
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.world.effect.MobEffects;
#if MC_VER < MC_1_17_1
import net.minecraft.tags.FluidTags;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.material.FluidState;
import org.lwjgl.opengl.GL15;
#else
import net.minecraft.world.level.material.FogType;
#endif
import net.minecraft.world.phys.Vec3;
import org.apache.logging.log4j.Logger;
import org.joml.Vector4f;
/**
* A singleton that contains everything
* related to rendering in Minecraft.
*
* @author James Seibel
* @version 12-12-2021
*/
//@Environment(EnvType.CLIENT)
public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
{
public static final MinecraftRenderWrapper INSTANCE = new MinecraftRenderWrapper();
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
private static final Minecraft MC = Minecraft.getInstance();
private static final IWrapperFactory FACTORY = WrapperFactory.INSTANCE;
private static final IOptifineAccessor OPTIFINE_ACCESSOR = ModAccessorInjector.INSTANCE.get(IOptifineAccessor.class);
/**
* In the case of immersive portals multiple levels may be active at once, causing conflicting lightmaps. <br>
* Requiring the use of multiple {@link LightMapWrapper}.
*/
public ConcurrentHashMap<IDimensionTypeWrapper, LightMapWrapper> lightmapByDimensionType = new ConcurrentHashMap<>();
/**
* Holds the render buffer that should be used when displaying levels to the screen.
* This is used for Optifine shader support so we can render directly to Optifine's level frame buffer.
*/
public int finalLevelFrameBufferId = -1;
@Override
public Vec3f getLookAtVector()
{
Camera camera = MC.gameRenderer.getMainCamera();
return new Vec3f(camera.getLookVector().x(), camera.getLookVector().y(), camera.getLookVector().z());
}
@Override
/** Unless you really need to know if the player is blind, use {@link MinecraftRenderWrapper#isFogStateSpecial()}/{@link IMinecraftRenderWrapper#isFogStateSpecial()} instead */
public boolean playerHasBlindingEffect()
{
return MC.player.getActiveEffectsMap().get(MobEffects.BLINDNESS) != null
#if MC_VER >= MC_1_19_2
|| MC.player.getActiveEffectsMap().get(MobEffects.DARKNESS) != null // Deep dark effect
#endif
;
}
@Override
public Vec3d getCameraExactPosition()
{
Camera camera = MC.gameRenderer.getMainCamera();
Vec3 projectedView = camera.getPosition();
return new Vec3d(projectedView.x, projectedView.y, projectedView.z);
}
@Override
public Color getFogColor(float partialTicks)
{
#if MC_VER < MC_1_17_1
float[] colorValues = new float[4];
GL15.glGetFloatv(GL15.GL_FOG_COLOR, colorValues);
return new Color(
Math.max(0f, Math.min(colorValues[0], 1f)), // r
Math.max(0f, Math.min(colorValues[1], 1f)), // g
Math.max(0f, Math.min(colorValues[2], 1f)), // b
Math.max(0f, Math.min(colorValues[3], 1f)) // a
);
#elif MC_VER < MC_1_21_3
FogRenderer.setupColor(MC.gameRenderer.getMainCamera(), partialTicks, MC.level, 1, MC.gameRenderer.getDarkenWorldAmount(partialTicks));
float[] colorValues = RenderSystem.getShaderFogColor();
return new Color(
Math.max(0f, Math.min(colorValues[0], 1f)), // r
Math.max(0f, Math.min(colorValues[1], 1f)), // g
Math.max(0f, Math.min(colorValues[2], 1f)), // b
Math.max(0f, Math.min(colorValues[3], 1f)) // a
);
#else
Vector4f colorValues = FogRenderer.computeFogColor(MC.gameRenderer.getMainCamera(), partialTicks, MC.level, 1, MC.gameRenderer.getDarkenWorldAmount(partialTicks));
return new Color(
Math.max(0f, Math.min(colorValues.x, 1f)), // r
Math.max(0f, Math.min(colorValues.y, 1f)), // g
Math.max(0f, Math.min(colorValues.z, 1f)), // b
Math.max(0f, Math.min(colorValues.w, 1f)) // a
);
#endif
}
// getSpecialFogColor() is the same as getFogColor()
@Override
public Color getSkyColor()
{
if (MC.level.dimensionType().hasSkyLight())
{
float frameTime;
#if MC_VER < MC_1_21_1
frameTime = MC.getFrameTime();
#elif MC_VER < MC_1_21_3
frameTime = MC.getTimer().getRealtimeDeltaTicks();
#else
frameTime = MC.deltaTracker.getGameTimeDeltaTicks();
#endif
#if MC_VER < MC_1_17_1
Vec3 colorValues = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getBlockPosition(), frameTime);
return new Color((float) colorValues.x, (float) colorValues.y, (float) colorValues.z);
#elif MC_VER < MC_1_21_3
Vec3 colorValues = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getPosition(), frameTime);
return new Color((float) colorValues.x, (float) colorValues.y, (float) colorValues.z);
#else
int argbColorInt = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getPosition(), frameTime);;
return ColorUtil.toColorObjARGB(argbColorInt); // TODO MC changed color formats
#endif
}
else
{
return new Color(0, 0, 0);
}
}
@Override
public double getFov(float partialTicks)
{
return MC.gameRenderer.getFov(MC.gameRenderer.getMainCamera(), partialTicks, true);
}
/** Measured in chunks */
@Override
public int getRenderDistance()
{
#if MC_VER < MC_1_18_2
//FIXME: How to resolve this?
return MC.options.renderDistance;
#else
return MC.options.getEffectiveRenderDistance();
#endif
}
@Override
public int getScreenWidth()
{
// alternate ways of getting the window's resolution,
// using one of these methods may fix the optifine render resolution bug
// TODO: test these once we can run with Optifine again
// int[] heightArray = new int[1];
// int[] widthArray = new int[1];
//
// long window = GLProxy.getInstance().minecraftGlContext;
// GLFW.glfwGetWindowSize(window, widthArray, heightArray); // option 1
// GLFW.glfwGetFramebufferSize(window, widthArray, heightArray); // option 2
int width = MC.getWindow().getWidth();
if (OPTIFINE_ACCESSOR != null)
{
// TODO remove comment after testing:
// this should fix the issue where different optifine render resolutions screw up the LOD rendering
width *= OPTIFINE_ACCESSOR.getRenderResolutionMultiplier();
}
return width;
}
@Override
public int getScreenHeight()
{
int height = MC.getWindow().getHeight();
if (OPTIFINE_ACCESSOR != null)
{
height *= OPTIFINE_ACCESSOR.getRenderResolutionMultiplier();
}
return height;
}
private RenderTarget getRenderTarget() { return MC.getMainRenderTarget(); }
@Override
public int getTargetFrameBuffer()
{
// used so we can access the framebuffer shaders end up rendering to
if (AbstractOptifineAccessor.optifinePresent())
{
return this.finalLevelFrameBufferId;
}
return this.getRenderTarget().frameBufferId;
}
@Override
public void clearTargetFrameBuffer() { this.finalLevelFrameBufferId = -1; }
@Override
public int getDepthTextureId() { return this.getRenderTarget().getDepthTextureId(); }
@Override
public int getColorTextureId() { return this.getRenderTarget().getColorTextureId(); }
@Override
public int getTargetFrameBufferViewportWidth()
{
return getRenderTarget().viewWidth;
}
@Override
public int getTargetFrameBufferViewportHeight()
{
return getRenderTarget().viewHeight;
}
@Override
public ILightMapWrapper getLightmapWrapper(ILevelWrapper level) { return this.lightmapByDimensionType.get(level.getDimensionType()); }
@Override
public boolean isFogStateSpecial()
{
#if MC_VER < MC_1_17_1
Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera();
FluidState fluidState = camera.getFluidInCamera();
Entity entity = camera.getEntity();
boolean isBlind = this.playerHasBlindingEffect();
isBlind |= fluidState.is(FluidTags.WATER);
isBlind |= fluidState.is(FluidTags.LAVA);
return isBlind;
#else
boolean isBlind = this.playerHasBlindingEffect();
return MC.gameRenderer.getMainCamera().getFluidInCamera() != FogType.NONE || isBlind;
#endif
}
/**
* It's better to use {@link MinecraftRenderWrapper#setLightmapId(int, IClientLevelWrapper)} if possible,
* however old MC versions don't support it.
*/
public void updateLightmap(NativeImage lightPixels, IClientLevelWrapper level)
{
// Using ClientLevelWrapper as the key would be better, but we don't have a consistent way to create the same
// object for the same MC level and/or the same hash,
// so this will have to do for now
IDimensionTypeWrapper dimensionType = level.getDimensionType();
LightMapWrapper wrapper = this.lightmapByDimensionType.computeIfAbsent(dimensionType, (dimType) -> new LightMapWrapper());
wrapper.uploadLightmap(lightPixels);
}
public void setLightmapId(int tetxureId, IClientLevelWrapper level)
{
// Using ClientLevelWrapper as the key would be better, but we don't have a consistent way to create the same
// object for the same MC level and/or the same hash,
// so this will have to do for now
IDimensionTypeWrapper dimensionType = level.getDimensionType();
LightMapWrapper wrapper = this.lightmapByDimensionType.computeIfAbsent(dimensionType, (dimType) -> new LightMapWrapper());
wrapper.setLightmapId(tetxureId);
}
}
@@ -0,0 +1,52 @@
package com.seibel.distanthorizons.common.wrappers.minecraft;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
import net.minecraft.server.dedicated.DedicatedServer;
import java.io.File;
//@Environment(EnvType.SERVER)
public class MinecraftServerWrapper implements IMinecraftSharedWrapper
{
public static final MinecraftServerWrapper INSTANCE = new MinecraftServerWrapper();
public DedicatedServer dedicatedServer = null;
//=============//
// constructor //
//=============//
private MinecraftServerWrapper() { }
//=========//
// methods //
//=========//
@Override
public boolean isDedicatedServer() { return true; }
@Override
public File getInstallationDirectory()
{
if (this.dedicatedServer == null)
{
throw new IllegalStateException("Trying to get Installation Direction before Dedicated server completed initialization!");
}
#if MC_VER < MC_1_21_1
return this.dedicatedServer.getServerDirectory();
#else
return this.dedicatedServer.getServerDirectory().toFile();
#endif
}
@Override
public int getPlayerCount()
{
return this.dedicatedServer.getPlayerCount();
}
}
@@ -0,0 +1,49 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.minecraft;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import net.minecraft.util.profiling.ProfilerFiller;
/**
* @author James Seibel
* @version 11-20-2021
*/
public class ProfilerWrapper implements IProfilerWrapper
{
public ProfilerFiller profiler;
public ProfilerWrapper(ProfilerFiller newProfiler) { this.profiler = newProfiler; }
/** starts a new section inside the currently running section */
@Override
public void push(String newSection) { this.profiler.push(newSection); }
/** ends the currently running section and starts a new one */
@Override
public void popPush(String newSection) { this.profiler.popPush(newSection); }
/** ends the currently running section */
@Override
public void pop() { this.profiler.pop(); }
}
@@ -0,0 +1,15 @@
package com.seibel.distanthorizons.common.wrappers.misc;
import net.minecraft.server.level.ServerLevel;
import org.jetbrains.annotations.Nullable;
public interface IMixinServerPlayer
{
@Nullable
ServerLevel distantHorizons$getDimensionChangeDestination();
#if MC_VER == MC_1_16_5
void distantHorizons$setDimensionChangeDestination(ServerLevel dimensionChangeDestination);
#endif
}
@@ -0,0 +1,104 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.misc;
import com.mojang.blaze3d.platform.NativeImage;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL32;
import java.nio.ByteBuffer;
public class LightMapWrapper implements ILightMapWrapper
{
private static final IMinecraftGLWrapper GLMC = SingletonInjector.INSTANCE.get(IMinecraftGLWrapper.class);
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private int textureId = 0;
//==============//
// constructors //
//==============//
public LightMapWrapper() { }
//==================//
// lightmap syncing //
//==================//
public void uploadLightmap(NativeImage image)
{
int currentTexture = GLMC.getActiveTexture();
if (this.textureId == 0)
{
this.createLightmap(image);
}
else
{
GLMC.glBindTexture(this.textureId);
}
image.upload(0, 0, 0, false);
// getActiveTexture() may return textures that aren't valid and attempting to bind them will
// throw a GL error in MC 1.21.1
if (GL32.glIsTexture(currentTexture))
{
GLMC.glBindTexture(currentTexture);
}
}
private void createLightmap(NativeImage image)
{
this.textureId = GLMC.glGenTextures();
GLMC.glBindTexture(this.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 setLightmapId(int minecraftLightmapTetxureId)
{
// just use the MC texture ID
this.textureId = minecraftLightmapTetxureId;
}
//==============//
// lightmap use //
//==============//
@Override
public void bind()
{
GLMC.glActiveTexture(GL32.GL_TEXTURE0);
GLMC.glBindTexture(this.textureId);
}
@Override
public void unbind() { GLMC.glBindTexture(0); }
}
@@ -0,0 +1,30 @@
package com.seibel.distanthorizons.common.wrappers.misc;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IMutableBlockPosWrapper;
import net.minecraft.core.BlockPos;
public class MutableBlockPosWrapper implements IMutableBlockPosWrapper
{
public final BlockPos.MutableBlockPos pos;
//=============//
// constructor //
//=============//
public MutableBlockPosWrapper()
{
this.pos = new BlockPos.MutableBlockPos();
}
//===========//
// overrides //
//===========//
@Override
public Object getWrappedMcObject() { return this.pos; }
}
@@ -0,0 +1,115 @@
package com.seibel.distanthorizons.common.wrappers.misc;
import com.google.common.base.Objects;
import com.google.common.collect.MapMaker;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
import com.seibel.distanthorizons.core.util.math.Vec3d;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import net.minecraft.world.phys.Vec3;
import java.net.SocketAddress;
import java.util.concurrent.ConcurrentMap;
/**
* This wrapper transparently ensures that the underlying {@link ServerPlayer} is always valid,
* unless the player has disconnected.
*/
public class ServerPlayerWrapper implements IServerPlayerWrapper
{
private static final ConcurrentMap<ServerGamePacketListenerImpl, ServerPlayerWrapper> serverPlayerWrapperMap = new MapMaker().weakKeys().weakValues().makeMap();
private final ServerGamePacketListenerImpl connection;
//=============//
// constructor //
//=============//
public static ServerPlayerWrapper getWrapper(ServerPlayer serverPlayer)
{ return serverPlayerWrapperMap.computeIfAbsent(serverPlayer.connection, ignored -> new ServerPlayerWrapper(serverPlayer.connection)); }
private ServerPlayerWrapper(ServerGamePacketListenerImpl connection) { this.connection = connection; }
//=========//
// getters //
//=========//
private ServerPlayer getServerPlayer() { return this.connection.player; }
@Override
public String getName() { return this.getServerPlayer().getName().getString(); }
@Override
public IServerLevelWrapper getLevel()
{
ServerLevel level = ((IMixinServerPlayer) this.getServerPlayer()).distantHorizons$getDimensionChangeDestination();
if (level == null)
{
#if MC_VER < MC_1_20_1
level = this.getServerPlayer().getLevel();
#else
level = this.getServerPlayer().serverLevel();
#endif
}
return ServerLevelWrapper.getWrapper(level);
}
@Override
public Vec3d getPosition()
{
Vec3 position = this.getServerPlayer().position();
return new Vec3d(position.x, position.y, position.z);
}
@Override
public int getViewDistance() { return this.getServerPlayer().server.getPlayerList().getViewDistance(); }
@Override
public SocketAddress getRemoteAddress()
{
#if MC_VER >= MC_1_19_4
return this.getServerPlayer().connection.getRemoteAddress();
#else // < 1.19.4
return this.getServerPlayer().connection.connection.getRemoteAddress();
#endif
}
//================//
// base overrides //
//================//
@Override
public Object getWrappedMcObject() { return this.getServerPlayer(); }
@Override
public String toString() { return "Wrapped{" + this.getServerPlayer() + "}"; }
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (!(obj instanceof ServerPlayerWrapper))
{
return false;
}
ServerPlayerWrapper that = (ServerPlayerWrapper) obj;
return Objects.equal(this.connection, that.connection);
}
@Override
public int hashCode() { return Objects.hashCode(this.connection); }
}
@@ -0,0 +1,333 @@
package com.seibel.distanthorizons.common.wrappers.world;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiLevelType;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
import com.seibel.distanthorizons.common.wrappers.block.ClientBlockStateColorCache;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.level.*;
import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ChunkSource;
import net.minecraft.world.phys.Vec3;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
#if MC_VER <= MC_1_20_4
import net.minecraft.world.level.chunk.ChunkStatus;
#else
import net.minecraft.world.level.chunk.status.ChunkStatus;
#endif
#if MC_VER < MC_1_21_3
#else
import com.seibel.distanthorizons.core.util.ColorUtil;
#endif
public class ClientLevelWrapper implements IClientLevelWrapper
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(ClientLevelWrapper.class.getSimpleName());
private static final ConcurrentHashMap<ClientLevel, ClientLevelWrapper> LEVEL_WRAPPER_BY_CLIENT_LEVEL = new ConcurrentHashMap<>(); // TODO can leak
private static final IKeyedClientLevelManager KEYED_CLIENT_LEVEL_MANAGER = SingletonInjector.INSTANCE.get(IKeyedClientLevelManager.class);
private static final Minecraft MINECRAFT = Minecraft.getInstance();
private final ClientLevel level;
private final ConcurrentHashMap<BlockState, ClientBlockStateColorCache> blockCache = new ConcurrentHashMap<>();
private BlockStateWrapper dirtBlockWrapper;
private BiomeWrapper plainsBiomeWrapper;
@Deprecated // TODO circular references are bad
private IDhLevel parentDhLevel;
//=============//
// constructor //
//=============//
protected ClientLevelWrapper(ClientLevel level) { this.level = level; }
//===============//
// wrapper logic //
//===============//
public static IClientLevelWrapper getWrapper(@NotNull ClientLevel level) { return getWrapper(level, false); }
@Nullable
public static IClientLevelWrapper getWrapper(@Nullable ClientLevel level, boolean bypassLevelKeyManager)
{
if (!bypassLevelKeyManager)
{
if (level == null)
{
return null;
}
// used if the client is connected to a server that defines the currently loaded level
IServerKeyedClientLevel overrideLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel();
if (overrideLevel != null)
{
return overrideLevel;
}
}
return LEVEL_WRAPPER_BY_CLIENT_LEVEL.computeIfAbsent(level, ClientLevelWrapper::new);
}
@Nullable
@Override
public IServerLevelWrapper tryGetServerSideWrapper()
{
try
{
Iterable<ServerLevel> serverLevels = MINECRAFT.getSingleplayerServer().getAllLevels();
// attempt to find the server level with the same dimension type
// TODO this assumes only one level per dimension type, the SubDimensionLevelMatcher will need to be added for supporting multiple levels per dimension
ServerLevelWrapper foundLevelWrapper = null;
// TODO: Surely there is a more efficient way to write this code
for (ServerLevel serverLevel : serverLevels)
{
if (serverLevel.dimension() == this.level.dimension())
{
foundLevelWrapper = ServerLevelWrapper.getWrapper(serverLevel);
break;
}
}
return foundLevelWrapper;
}
catch (Exception e)
{
LOGGER.error("Failed to get server side wrapper for client level: " + this.level);
return null;
}
}
//====================//
// base level methods //
//====================//
@Override
public int getBlockColor(DhBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper blockWrapper)
{
ClientBlockStateColorCache blockColorCache = this.blockCache.computeIfAbsent(
((BlockStateWrapper) blockWrapper).blockState,
(block) -> new ClientBlockStateColorCache(block, this));
return blockColorCache.getColor((BiomeWrapper) biome, pos);
}
@Override
public int getDirtBlockColor()
{
if (this.dirtBlockWrapper == null)
{
try
{
this.dirtBlockWrapper = (BlockStateWrapper) BlockStateWrapper.deserialize(BlockStateWrapper.DIRT_RESOURCE_LOCATION_STRING, this);
}
catch (IOException e)
{
// shouldn't happen, but just in case
LOGGER.warn("Unable to get dirt color with resource location ["+BlockStateWrapper.DIRT_RESOURCE_LOCATION_STRING+"] with level ["+this+"].", e);
return -1;
}
}
return this.getBlockColor(DhBlockPos.ZERO,BiomeWrapper.EMPTY_WRAPPER, this.dirtBlockWrapper);
}
@Override
public void clearBlockColorCache() { this.blockCache.clear(); }
@Override
public IBiomeWrapper getPlainsBiomeWrapper()
{
if (this.plainsBiomeWrapper == null)
{
try
{
this.plainsBiomeWrapper = (BiomeWrapper) BiomeWrapper.deserialize(BiomeWrapper.PLAINS_RESOURCE_LOCATION_STRING, this);
}
catch (IOException e)
{
// shouldn't happen, but just in case
LOGGER.warn("Unable to get planes biome with resource location ["+BiomeWrapper.PLAINS_RESOURCE_LOCATION_STRING+"] with level ["+this+"].", e);
return null;
}
}
return this.plainsBiomeWrapper;
}
@Override
public IDimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }
@Override
public String getDimensionName() { return this.level.dimension().location().toString(); }
@Override
public long getHashedSeed() { return this.level.getBiomeManager().biomeZoomSeed; }
@Override
public String getDhIdentifier() { return this.getHashedSeedEncoded() + "@" + this.getDimensionName(); }
@Override
public EDhApiLevelType getLevelType() { return EDhApiLevelType.CLIENT_LEVEL; }
public ClientLevel getLevel() { return this.level; }
@Override
public boolean hasCeiling() { return this.level.dimensionType().hasCeiling(); }
@Override
public boolean hasSkyLight() { return this.level.dimensionType().hasSkyLight(); }
@Override
public int getMaxHeight() { return this.level.getHeight(); }
@Override
public int getMinHeight()
{
#if MC_VER < MC_1_17_1
return 0;
#elif MC_VER < MC_1_21_3
return this.level.getMinBuildHeight();
#else
return this.level.getMinY();
#endif
}
@Override
public IChunkWrapper tryGetChunk(DhChunkPos pos)
{
if (!this.level.hasChunk(pos.getX(), pos.getZ()))
{
return null;
}
ChunkAccess chunk = this.level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.EMPTY, false);
if (chunk == null)
{
return null;
}
return new ChunkWrapper(chunk, this);
}
@Override
public boolean hasChunkLoaded(int chunkX, int chunkZ)
{
ChunkSource source = this.level.getChunkSource();
return source.hasChunk(chunkX, chunkZ);
}
@Override
public IBlockStateWrapper getBlockState(DhBlockPos pos)
{ return BlockStateWrapper.fromBlockState(this.level.getBlockState(McObjectConverter.Convert(pos)), this); }
@Override
public IBiomeWrapper getBiome(DhBlockPos pos) { return BiomeWrapper.getBiomeWrapper(this.level.getBiome(McObjectConverter.Convert(pos)), this); }
@Override
public ClientLevel getWrappedMcObject() { return this.level; }
@Override
public void onUnload()
{
LEVEL_WRAPPER_BY_CLIENT_LEVEL.remove(this.level);
this.parentDhLevel = null;
}
@Override
public File getDhSaveFolder()
{
if (this.parentDhLevel == null)
{
return null;
}
return this.parentDhLevel.getSaveStructure().getSaveFolder(this);
}
//===================//
// generic rendering //
//===================//
@Override
public void setParentLevel(IDhLevel parentLevel) { this.parentDhLevel = parentLevel; }
@Override
public IDhApiCustomRenderRegister getRenderRegister()
{
if (this.parentDhLevel == null)
{
return null;
}
return this.parentDhLevel.getGenericRenderer();
}
@Override
public Color getCloudColor(float tickDelta)
{
#if MC_VER < MC_1_21_3
Vec3 colorVec3 = this.level.getCloudColor(tickDelta);
return new Color((float)colorVec3.x, (float)colorVec3.y, (float)colorVec3.z);
#else
int argbColor = this.level.getCloudColor(tickDelta);
return ColorUtil.toColorObjARGB(argbColor);
#endif
}
//================//
// base overrides //
//================//
@Override
public String toString()
{
if (this.level == null)
{
return "Wrapped{null}";
}
return "Wrapped{" + this.level.toString() + "@" + this.getDhIdentifier() + "}";
}
}
@@ -0,0 +1,122 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.world;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper;
import net.minecraft.world.level.dimension.DimensionType;
/**
* @author James Seibel
*/
public class DimensionTypeWrapper implements IDimensionTypeWrapper
{
private static final ConcurrentMap<String, DimensionTypeWrapper> DIMENSION_WRAPPER_BY_NAME = new ConcurrentHashMap<>();
private final DimensionType dimensionType;
//=============//
// Constructor //
//=============//
public DimensionTypeWrapper(DimensionType dimensionType) { this.dimensionType = dimensionType; }
public static DimensionTypeWrapper getDimensionTypeWrapper(DimensionType dimensionType)
{
String dimName = getName(dimensionType);
// check if the dimension has already been wrapped
if (DIMENSION_WRAPPER_BY_NAME.containsKey(dimName)
&& DIMENSION_WRAPPER_BY_NAME.get(dimName) != null)
{
return DIMENSION_WRAPPER_BY_NAME.get(dimName);
}
// create the missing wrapper
DimensionTypeWrapper dimensionTypeWrapper = new DimensionTypeWrapper(dimensionType);
DIMENSION_WRAPPER_BY_NAME.put(dimName, dimensionTypeWrapper);
return dimensionTypeWrapper;
}
public static void clearMap() { DIMENSION_WRAPPER_BY_NAME.clear(); }
//=================//
// wrapper methods //
//=================//
@Override
public String getName() { return getName(this.dimensionType); }
public static String getName(DimensionType dimensionType)
{
#if MC_VER <= MC_1_16_5
// effectsLocation() is marked as client only, so using the backing field directly
return dimensionType.effectsLocation.getPath();
#else
return dimensionType.effectsLocation().getPath();
#endif
}
@Override
public boolean hasCeiling() { return this.dimensionType.hasCeiling(); }
@Override
public boolean hasSkyLight() { return this.dimensionType.hasSkyLight(); }
@Override
public Object getWrappedMcObject() { return this.dimensionType; }
// there's definitely a better way of doing this, but it should work well enough for now
@Override
public boolean isTheEnd() { return this.getName().equalsIgnoreCase("the_end"); }
@Override
public double getCoordinateScale() { return this.dimensionType.coordinateScale(); }
//================//
// base overrides //
//================//
@Override
public boolean equals(Object obj)
{
if (obj.getClass() != DimensionTypeWrapper.class)
{
return false;
}
else
{
DimensionTypeWrapper other = (DimensionTypeWrapper) obj;
return other.getName().equals(this.getName());
}
}
}
@@ -0,0 +1,220 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.world;
import java.io.File;
import java.util.concurrent.ConcurrentHashMap;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiLevelType;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.core.level.IDhLevel;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ChunkSource;
#if MC_VER <= MC_1_20_4
import net.minecraft.world.level.chunk.ChunkStatus;
#else
import net.minecraft.world.level.chunk.status.ChunkStatus;
#endif
#if MC_VER < MC_1_21_3
#else
import java.nio.file.Path;
#endif
import org.apache.logging.log4j.Logger;
public class ServerLevelWrapper implements IServerLevelWrapper
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private static final ConcurrentHashMap<ServerLevel, ServerLevelWrapper> LEVEL_WRAPPER_BY_SERVER_LEVEL = new ConcurrentHashMap<>();
private final ServerLevel level;
@Deprecated // TODO circular references are bad
private IDhLevel parentDhLevel;
//==============//
// constructors //
//==============//
public static ServerLevelWrapper getWrapper(ServerLevel level)
{ return LEVEL_WRAPPER_BY_SERVER_LEVEL.computeIfAbsent(level, ServerLevelWrapper::new); }
public ServerLevelWrapper(ServerLevel level) { this.level = level; }
//=========//
// methods //
//=========//
@Override
public File getMcSaveFolder()
{
#if MC_VER < MC_1_21_3
return this.level.getChunkSource().getDataStorage().dataFolder;
#else
return this.level.getChunkSource().getDataStorage().dataFolder.toFile();
#endif
}
@Override
public String getWorldFolderName()
{
#if MC_VER >= MC_1_17_1
return this.level.getServer().getWorldScreenshotFile().get().getParent().getFileName().toString();
#else // <= 1.16.5
return this.level.getServer().getWorldScreenshotFile().getParentFile().getName();
#endif
}
@Override
public DimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }
@Override
public String getDimensionName() { return this.level.dimension().location().toString(); }
@Override
public long getHashedSeed() { return this.level.getBiomeManager().biomeZoomSeed; }
@Override
public String getDhIdentifier() { return this.getDimensionName(); }
@Override
public EDhApiLevelType getLevelType() { return EDhApiLevelType.SERVER_LEVEL; }
public ServerLevel getLevel() { return this.level; }
@Override
public boolean hasCeiling() { return this.level.dimensionType().hasCeiling(); }
@Override
public boolean hasSkyLight() { return this.level.dimensionType().hasSkyLight(); }
@Override
public int getMaxHeight() { return this.level.getHeight(); }
@Override
public int getMinHeight()
{
#if MC_VER < MC_1_17_1
return 0;
#elif MC_VER < MC_1_21_3
return this.level.getMinBuildHeight();
#else
return this.level.getMinY();
#endif
}
@Override
public IChunkWrapper tryGetChunk(DhChunkPos pos)
{
if (!this.level.hasChunk(pos.getX(), pos.getZ()))
{
return null;
}
ChunkAccess chunk = this.level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.FULL, false);
if (chunk == null)
{
return null;
}
return new ChunkWrapper(chunk, this);
}
@Override
public boolean hasChunkLoaded(int chunkX, int chunkZ)
{
// world.hasChunk(chunkX, chunkZ); THIS DOES NOT WORK FOR CLIENT LEVEL CAUSE MOJANG ALWAYS RETURN TRUE FOR THAT!
ChunkSource source = this.level.getChunkSource();
return source.hasChunk(chunkX, chunkZ);
}
@Override
public IBlockStateWrapper getBlockState(DhBlockPos pos)
{
return BlockStateWrapper.fromBlockState(this.level.getBlockState(McObjectConverter.Convert(pos)), this);
}
@Override
public IBiomeWrapper getBiome(DhBlockPos pos)
{
return BiomeWrapper.getBiomeWrapper(this.level.getBiome(McObjectConverter.Convert(pos)), this);
}
@Override
public ServerLevel getWrappedMcObject() { return this.level; }
@Override
public void onUnload() { LEVEL_WRAPPER_BY_SERVER_LEVEL.remove(this.level); }
@Override
public void setParentLevel(IDhLevel parentLevel) { this.parentDhLevel = parentLevel; }
@Override
public IDhApiCustomRenderRegister getRenderRegister()
{
if (this.parentDhLevel == null)
{
return null;
}
return this.parentDhLevel.getGenericRenderer();
}
@Override
public File getDhSaveFolder()
{
if (this.parentDhLevel == null)
{
return null;
}
return this.parentDhLevel.getSaveStructure().getSaveFolder(this);
}
//================//
// base overrides //
//================//
@Override
public String toString() { return "Wrapped{" + this.level.toString() + "@" + this.getDhIdentifier() + "}"; }
}
@@ -0,0 +1,188 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.worldGeneration;
import java.lang.invoke.MethodHandles;
import java.util.concurrent.*;
import java.util.function.Consumer;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiDistantGeneratorMode;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiWorldGenerationStep;
import com.seibel.distanthorizons.core.util.objects.UncheckedInterruptedException;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.util.objects.EventTimer;
import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import org.apache.logging.log4j.Logger;
public final class GenerationEvent
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
private static int generationFutureDebugIDs = 0;
public final int id;
public final ThreadedParameters threadedParam;
public final DhChunkPos minPos;
/** the number of chunks wide this event is */
public final int size;
public final EDhApiWorldGenerationStep targetGenerationStep;
public final EDhApiDistantGeneratorMode generatorMode;
public EventTimer timer = null;
public long inQueueTime;
public long timeoutTime = -1;
public CompletableFuture<Void> future = null;
public final Consumer<IChunkWrapper> resultConsumer;
public GenerationEvent(
DhChunkPos minPos, int size, BatchGenerationEnvironment generationGroup,
EDhApiDistantGeneratorMode generatorMode, EDhApiWorldGenerationStep targetGenerationStep, Consumer<IChunkWrapper> resultConsumer)
{
this.inQueueTime = System.nanoTime();
this.id = generationFutureDebugIDs++;
this.minPos = minPos;
this.size = size;
this.generatorMode = generatorMode;
this.targetGenerationStep = targetGenerationStep;
this.threadedParam = ThreadedParameters.getOrMake(generationGroup.params);
this.resultConsumer = resultConsumer;
}
public static GenerationEvent startEvent(
DhChunkPos minPos, int size, BatchGenerationEnvironment genEnvironment,
EDhApiDistantGeneratorMode generatorMode, EDhApiWorldGenerationStep target, Consumer<IChunkWrapper> resultConsumer,
ExecutorService worldGeneratorThreadPool)
{
GenerationEvent generationEvent = new GenerationEvent(minPos, size, genEnvironment, generatorMode, target, resultConsumer);
generationEvent.future = CompletableFuture.supplyAsync(() ->
{
long runStartTime = System.nanoTime();
generationEvent.timeoutTime = runStartTime;
generationEvent.inQueueTime = runStartTime - generationEvent.inQueueTime;
generationEvent.timer = new EventTimer("setup");
BatchGenerationEnvironment.isDistantGeneratorThread.set(true);
try
{
genEnvironment.generateLodFromListAsync(generationEvent, (runnable) ->
{
worldGeneratorThreadPool.execute(() ->
{
boolean alreadyMarked = BatchGenerationEnvironment.isCurrentThreadDistantGeneratorThread();
if (!alreadyMarked)
{
BatchGenerationEnvironment.isDistantGeneratorThread.set(true);
}
try
{
runnable.run();
}
catch (Throwable throwable)
{
handleWorldGenThrowable(generationEvent, throwable);
}
finally
{
if (!alreadyMarked)
{
BatchGenerationEnvironment.isDistantGeneratorThread.set(false);
}
}
});
});
}
catch (Throwable initialThrowable)
{
handleWorldGenThrowable(generationEvent, initialThrowable);
}
finally
{
BatchGenerationEnvironment.isDistantGeneratorThread.remove();
}
return null;
}, worldGeneratorThreadPool);
return generationEvent;
}
/** There's probably a better way to handle this, but it'll work for now */
private static void handleWorldGenThrowable(GenerationEvent generationEvent, Throwable initialThrowable)
{
Throwable throwable = initialThrowable;
while (throwable instanceof CompletionException)
{
throwable = throwable.getCause();
}
if (throwable instanceof InterruptedException
|| throwable instanceof UncheckedInterruptedException
|| throwable instanceof RejectedExecutionException)
{
// these exceptions can be ignored, generally they just mean
// the thread is busy so it'll need to try again later.
// FIXME this should cause the world gen task to be re-queued so we can try again later
// however, currently it can cause large gaps in the world gen instead.
// These gaps will generate correctly if the level is reloaded and the world gen is re-queued,
// however this is makes it look like the generator isn't working or skipped something.
}
else
{
generationEvent.future.completeExceptionally(throwable);
}
}
public boolean isComplete() { return this.future.isDone(); }
public boolean hasTimeout(int duration, TimeUnit unit)
{
if (this.timeoutTime == -1)
{
return false;
}
long currentTime = System.nanoTime();
long delta = currentTime - this.timeoutTime;
return (delta > TimeUnit.NANOSECONDS.convert(duration, unit));
}
public boolean terminate()
{
LOGGER.info("======================DUMPING ALL THREADS FOR WORLD GEN=======================");
ThreadPoolUtil.WORLD_GEN_THREAD_FACTORY.dumpAllThreadStacks();
this.future.cancel(true);
return this.future.isCancelled();
}
public void refreshTimeout()
{
this.timeoutTime = System.nanoTime();
UncheckedInterruptedException.throwIfInterrupted();
}
@Override
public String toString() { return this.id + ":" + this.size + "@" + this.minPos + "(" + this.targetGenerationStep + ")"; }
}
@@ -0,0 +1,113 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.worldGeneration;
import com.mojang.datafixers.DataFixer;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.level.IDhServerLevel;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ThreadedLevelLightEngine;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeManager;
import net.minecraft.world.level.chunk.ChunkGenerator;
#if MC_VER >= MC_1_18_2
import net.minecraft.world.level.chunk.storage.ChunkScanAccess;
#endif
import net.minecraft.world.level.levelgen.WorldGenSettings;
#if MC_VER < MC_1_19_2
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager;
#else
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager;
import net.minecraft.world.level.levelgen.RandomState;
#if MC_VER >= MC_1_19_4
import net.minecraft.world.level.levelgen.WorldOptions;
import net.minecraft.core.registries.Registries;
#endif
#endif
import net.minecraft.world.level.storage.WorldData;
public final class GlobalParameters
{
public final ChunkGenerator generator;
public final IDhServerLevel lodLevel;
public final ServerLevel level;
public final Registry<Biome> biomes;
public final RegistryAccess registry;
public final long worldSeed;
public final DataFixer fixerUpper;
#if MC_VER < MC_1_19_2
public final StructureManager structures;
#else
public final StructureTemplateManager structures;
public final RandomState randomState;
#endif
#if MC_VER < MC_1_19_4
public final WorldGenSettings worldGenSettings;
#else
public final WorldOptions worldOptions;
#endif
#if MC_VER >= MC_1_18_2
public final BiomeManager biomeManager;
public final ChunkScanAccess chunkScanner; // FIXME: Figure out if this is actually needed
#endif
public GlobalParameters(IDhServerLevel lodLevel)
{
this.lodLevel = lodLevel;
this.level = ((ServerLevelWrapper) lodLevel.getServerLevelWrapper()).getWrappedMcObject();
MinecraftServer server = this.level.getServer();
WorldData worldData = server.getWorldData();
this.registry = server.registryAccess();
#if MC_VER < MC_1_19_4
this.worldGenSettings = worldData.worldGenSettings();
this.biomes = registry.registryOrThrow(Registry.BIOME_REGISTRY);
this.worldSeed = worldGenSettings.seed();
#elif MC_VER < MC_1_21_3
this.worldOptions = worldData.worldGenOptions();
this.biomes = registry.registryOrThrow(Registries.BIOME);
this.worldSeed = worldOptions.seed();
#else
this.worldOptions = worldData.worldGenOptions();
this.biomes = this.registry.lookupOrThrow(Registries.BIOME);
this.worldSeed = this.worldOptions.seed();
#endif
#if MC_VER >= MC_1_18_2
this.biomeManager = new BiomeManager(this.level, BiomeManager.obfuscateSeed(this.worldSeed));
this.chunkScanner = this.level.getChunkSource().chunkScanner();
#endif
this.structures = server.getStructureManager();
this.generator = this.level.getChunkSource().getGenerator();
this.fixerUpper = server.getFixerUpper();
#if MC_VER >= MC_1_19_2
this.randomState = this.level.getChunkSource().randomState();
#endif
}
}
@@ -0,0 +1,56 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.worldGeneration;
//FIXME: Move this outside the WorldGenerationStep thingy
public class Rolling
{
private final int size;
private double total = 0d;
private int index = 0;
private final double[] samples;
public Rolling(int size)
{
this.size = size;
samples = new double[size];
for (int i = 0; i < size; i++)
{
samples[i] = 0d;
}
}
public void add(double x)
{
total -= samples[index];
samples[index] = x;
total += x;
if (++index == size)
index = 0; // cheaper than modulus
}
public double getAverage()
{
return size == 0 ? 0 : total / size;
}
}
@@ -0,0 +1,109 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.worldGeneration;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment.PerfCalculator;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject.WorldGenStructFeatManager;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.WorldGenLevel;
#if MC_VER >= MC_1_18_2
import net.minecraft.world.level.levelgen.structure.StructureCheck;
#endif
public final class ThreadedParameters
{
private static final ThreadLocal<ThreadedParameters> LOCAL_PARAM = new ThreadLocal<>();
final ServerLevel level;
public WorldGenStructFeatManager structFeat = null;
#if MC_VER >= MC_1_18_2
public StructureCheck structCheck;
#endif
boolean isValid = true;
public final PerfCalculator perf = new PerfCalculator();
private static GlobalParameters previousGlobalParameters = null;
public static ThreadedParameters getOrMake(GlobalParameters param)
{
ThreadedParameters tParam = LOCAL_PARAM.get();
if (tParam != null && tParam.isValid && tParam.level == param.level)
{
return tParam;
}
tParam = new ThreadedParameters(param);
LOCAL_PARAM.set(tParam);
return tParam;
}
private ThreadedParameters(GlobalParameters param)
{
previousGlobalParameters = param;
this.level = param.level;
#if MC_VER < MC_1_18_2
this.structFeat = new WorldGenStructFeatManager(param.worldGenSettings, level);
#elif MC_VER < MC_1_19_2
this.structCheck = this.createStructureCheck(param);
#else
this.structCheck = new StructureCheck(param.chunkScanner, param.registry, param.structures,
param.level.dimension(), param.generator, param.randomState, level, param.generator.getBiomeSource(), param.worldSeed,
param.fixerUpper);
#endif
}
public void markAsInvalid() { isValid = false; }
public void makeStructFeat(WorldGenLevel genLevel, GlobalParameters param)
{
#if MC_VER < MC_1_19_4
structFeat = new WorldGenStructFeatManager(param.worldGenSettings, genLevel #if MC_VER >= MC_1_18_2 , structCheck #endif );
#else
structFeat = new WorldGenStructFeatManager(param.worldOptions, genLevel, structCheck);
#endif
}
#if MC_VER >= MC_1_18_2 && MC_VER < MC_1_19_2
public void recreateStructureCheck()
{
if (previousGlobalParameters != null)
{
this.structCheck = createStructureCheck(previousGlobalParameters);
}
}
private StructureCheck createStructureCheck(GlobalParameters param)
{
return new StructureCheck(param.chunkScanner, param.registry, param.structures,
param.level.dimension(), param.generator, this.level, param.generator.getBiomeSource(), param.worldSeed,
param.fixerUpper);
}
#else
public void recreateStructureCheck() { /* do nothing */ }
#endif
}
@@ -0,0 +1,597 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU GPL v3 License.
*
* Copyright (C) 2020 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.distanthorizons.common.wrappers.worldGeneration.mimicObject;
import com.mojang.serialization.Codec;
import com.mojang.serialization.Dynamic;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
import com.seibel.distanthorizons.core.logging.ConfigBasedLogger;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import it.unimi.dsi.fastutil.shorts.ShortList;
import net.minecraft.core.Registry;
#if MC_VER >= MC_1_19_4
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
#endif
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.Tag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.*;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.*;
#if MC_VER < MC_1_21_3
import net.minecraft.world.level.chunk.storage.ChunkSerializer;
#else
#endif
import net.minecraft.world.level.levelgen.Heightmap;
#if MC_VER >= MC_1_18_2
import net.minecraft.world.level.levelgen.blending.BlendingData;
#if MC_VER < MC_1_19_2
import net.minecraft.world.level.levelgen.feature.StructureFeature;
#endif
import net.minecraft.world.ticks.LevelChunkTicks;
#endif
#if MC_VER >= MC_1_18_2
import net.minecraft.core.Holder;
#if MC_VER < MC_1_19_2
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
#endif
#endif
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
import net.minecraft.world.level.material.Fluids;
#endif
#if MC_VER == MC_1_20_6
import net.minecraft.world.level.chunk.status.ChunkStatus;
import net.minecraft.world.level.chunk.status.ChunkType;
#elif MC_VER >= MC_1_21_1
import net.minecraft.world.level.chunk.status.ChunkStatus;
import net.minecraft.world.level.chunk.status.ChunkType;
#endif
import net.minecraft.world.level.material.Fluid;
public class ChunkLoader
{
private static boolean zeroChunkPosErrorLogged = false;
#if MC_VER >= MC_1_19_2
private static final Codec<PalettedContainer<BlockState>> BLOCK_STATE_CODEC = PalettedContainer.codecRW(Block.BLOCK_STATE_REGISTRY, BlockState.CODEC, PalettedContainer.Strategy.SECTION_STATES, Blocks.AIR.defaultBlockState());
#elif MC_VER >= MC_1_18_2
private static final Codec<PalettedContainer<BlockState>> BLOCK_STATE_CODEC = PalettedContainer.codec(Block.BLOCK_STATE_REGISTRY, BlockState.CODEC, PalettedContainer.Strategy.SECTION_STATES, Blocks.AIR.defaultBlockState());
#endif
private static final String TAG_UPGRADE_DATA = "UpgradeData";
private static final String BLOCK_TICKS_TAG_18 = "block_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;
private static boolean lightingSectionErrorLogged = false;
private static final ConcurrentHashMap<String, Object> LOGGED_ERROR_MESSAGE_MAP = new ConcurrentHashMap<>();
//============//
// read chunk //
//============//
public static LevelChunk read(WorldGenLevel level, ChunkPos chunkPos, CompoundTag chunkData)
{
#if MC_VER < MC_1_18_2
CompoundTag tagLevel = chunkData.getCompound("Level");
#else
CompoundTag tagLevel = chunkData;
#endif
ChunkPos actualPos = new ChunkPos(tagLevel.getInt("xPos"), tagLevel.getInt("zPos"));
if (!Objects.equals(chunkPos, actualPos))
{
#if MC_VER >= MC_1_18_2
if (actualPos.equals(ChunkPos.ZERO))
#else
if (actualPos.equals(ChunkPos.INVALID_CHUNK_POS))
#endif
{
if (!zeroChunkPosErrorLogged)
{
zeroChunkPosErrorLogged = true;
// explicit chunkPos toString is necessary otherwise the JDK 17 compiler breaks
LOGGER.warn("Chunk file at ["+chunkPos.toString()+"] doesn't have a chunk pos. \n" +
"This might happen if the world was created using an external program. \n" +
"DH will attempt to parse the chunk anyway and won't log this message again.\n" +
"If issues arise please try optimizing your world to fix this issue. \n" +
"World optimization can be done from the singleplayer world selection screen."+
"");
}
}
else
{
// everything is on one line to fix a JDK 17 compiler issue
// if the issue is ever resolved, feel free to make this multi-line for readability
LOGGER.error("Chunk file at ["+chunkPos.toString()+"] is in the wrong location. \nPlease try optimizing your world to fix this issue. \nWorld optimization can be done from the singleplayer world selection screen. \n(Expected pos: ["+chunkPos.toString()+"], actual ["+actualPos.toString()+"])");
return null;
}
}
#if MC_VER < MC_1_20_6
ChunkStatus.ChunkType chunkType;
#else
ChunkType chunkType;
#endif
chunkType = readChunkType(tagLevel);
#if MC_VER < MC_1_18_2
if (chunkType != ChunkStatus.ChunkType.LEVELCHUNK)
return null;
#else
BlendingData blendingData = readBlendingData(tagLevel);
#if MC_VER < MC_1_19_2
if (chunkType == ChunkStatus.ChunkType.PROTOCHUNK && (blendingData == null || !blendingData.oldNoise()))
return null;
#else
if (chunkType == #if MC_VER < MC_1_20_6 ChunkStatus.ChunkType.PROTOCHUNK #else ChunkType.PROTOCHUNK #endif && blendingData == null)
return null;
#endif
#endif
long inhabitedTime = tagLevel.getLong("InhabitedTime");
//================== Read params for making the LevelChunk ==================
UpgradeData upgradeData = tagLevel.contains(TAG_UPGRADE_DATA, 10)
? new UpgradeData(tagLevel.getCompound(TAG_UPGRADE_DATA)#if MC_VER >= MC_1_17_1 , level #endif )
: UpgradeData.EMPTY;
boolean isLightOn = tagLevel.getBoolean("isLightOn");
#if MC_VER < MC_1_18_2
ChunkBiomeContainer chunkBiomeContainer = new ChunkBiomeContainer(
level.getLevel().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY)#if MC_VER >= 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 MC_VER >= 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 MC_VER >= MC_1_17_1 , level #endif );
#else
#if MC_VER < MC_1_19_4
LevelChunkTicks<Block> blockTicks = LevelChunkTicks.load(tagLevel.getList(BLOCK_TICKS_TAG_18, 10),
string -> Registry.BLOCK.getOptional(ResourceLocation.tryParse(string)), chunkPos);
LevelChunkTicks<Fluid> fluidTicks = LevelChunkTicks.load(tagLevel.getList(FLUID_TICKS_TAG_18, 10),
string -> Registry.FLUID.getOptional(ResourceLocation.tryParse(string)), chunkPos);
#else
LevelChunkTicks<Block> blockTicks = LevelChunkTicks.load(tagLevel.getList(BLOCK_TICKS_TAG_18, 10),
(string -> BuiltInRegistries.BLOCK.getOptional(ResourceLocation.tryParse(string))), chunkPos);
LevelChunkTicks<Fluid> fluidTicks = LevelChunkTicks.load(tagLevel.getList(FLUID_TICKS_TAG_18, 10),
string -> BuiltInRegistries.FLUID.getOptional(ResourceLocation.tryParse(string)), chunkPos);
#endif
#endif
LevelChunkSection[] levelChunkSections = readSections(level, chunkPos, tagLevel);
// ====================== Make the chunk =========================
#if MC_VER < MC_1_18_2
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
chunk.setLightCorrect(isLightOn);
readHeightmaps(chunk, chunkData);
readPostPocessings(chunk, chunkData);
return chunk;
}
private static LevelChunkSection[] readSections(LevelAccessor level, ChunkPos chunkPos, CompoundTag chunkData)
{
#if MC_VER >= MC_1_18_2
#if MC_VER < MC_1_19_4
Registry<Biome> biomes = level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY);
#elif MC_VER < MC_1_21_3
Registry<Biome> biomes = level.registryAccess().registryOrThrow(Registries.BIOME);
#else
Registry<Biome> biomes = level.registryAccess().lookupOrThrow(Registries.BIOME);
#endif
#if MC_VER < MC_1_18_2
Codec<PalettedContainer<Biome>> biomeCodec = PalettedContainer.codec(
biomes, biomes.byNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS));
#elif MC_VER < MC_1_19_2
Codec<PalettedContainer<Holder<Biome>>> biomeCodec = PalettedContainer.codec(
biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS));
#elif MC_VER < MC_1_21_3
Codec<PalettedContainer<Holder<Biome>>> biomeCodec = PalettedContainer.codecRW(
biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS));
#else
Codec<PalettedContainer<Holder<Biome>>> biomeCodec = PalettedContainer.codecRW(
biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS));
#endif
#endif
int sectionYIndex = #if MC_VER < MC_1_17_1 16; #else level.getSectionsCount(); #endif
LevelChunkSection[] chunkSections = new LevelChunkSection[sectionYIndex];
boolean isLightOn = chunkData.getBoolean("isLightOn");
boolean hasSkyLight = level.dimensionType().hasSkyLight();
ListTag tagSections = chunkData.getList("Sections", 10);
if (tagSections.isEmpty()) tagSections = chunkData.getList("sections", 10);
for (int j = 0; j < tagSections.size(); ++j)
{
CompoundTag tagSection = tagSections.getCompound(j);
int sectionYPos = tagSection.getByte("Y");
#if MC_VER < MC_1_18_2
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 MC_VER < MC_1_17_1 sectionYPos #else level.getSectionIndexFromSectionY(sectionYPos) #endif ]
= levelChunkSection;
}
#else
int sectionId = level.getSectionIndexFromSectionY(sectionYPos);
if (sectionId >= 0 && sectionId < chunkSections.length)
{
PalettedContainer<BlockState> blockStateContainer;
#if MC_VER < MC_1_18_2
PalettedContainer<Biome> biomeContainer;
#else
PalettedContainer<Holder<Biome>> biomeContainer;
#endif
blockStateContainer = tagSection.contains("block_states", 10)
? BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagSection.getCompound("block_states"))
.promotePartial(string -> logBlockDeserializationWarning(chunkPos, sectionYPos, string))
#if MC_VER < MC_1_20_6
.getOrThrow(false, (message) -> logWarningOnce(message))
#else
.getOrThrow((message) -> logErrorAndReturnException(message))
#endif
: new PalettedContainer<BlockState>(Block.BLOCK_STATE_REGISTRY, Blocks.AIR.defaultBlockState(), PalettedContainer.Strategy.SECTION_STATES);
#if MC_VER < MC_1_18_2
biomeContainer = tagSection.contains("biomes", 10)
? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, sectionYPos, string)).getOrThrow(false, (message) -> logWarningOnce(message))
: new PalettedContainer<Biome>(biomes, biomes.getOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES);
#else
if (tagSection.contains("biomes", 10))
{
biomeContainer =
biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes"))
.promotePartial(string -> logBiomeDeserializationWarning(chunkPos, sectionYIndex, (String) string))
#if MC_VER < MC_1_20_6
.getOrThrow(false, (message) -> logWarningOnce(message));
#else
.getOrThrow((message) -> logErrorAndReturnException(message));
#endif
}
else
{
biomeContainer = new PalettedContainer<Holder<Biome>>(biomes.asHolderIdMap(),
#if MC_VER < MC_1_21_3
biomes.getHolderOrThrow(Biomes.PLAINS),
#else
biomes.getOrThrow(Biomes.PLAINS),
#endif
PalettedContainer.Strategy.SECTION_BIOMES);
}
#endif
#if MC_VER < MC_1_20_1
chunkSections[sectionId] = new LevelChunkSection(sectionYPos, blockStateContainer, biomeContainer);
#else
chunkSections[sectionId] = new LevelChunkSection(blockStateContainer, biomeContainer);
#endif
}
#endif
}
return chunkSections;
}
private static
#if MC_VER < MC_1_20_6 ChunkStatus.ChunkType
#elif MC_VER < MC_1_21_1 ChunkType
#else ChunkType #endif
readChunkType(CompoundTag tagLevel)
{
ChunkStatus chunkStatus = ChunkStatus.byName(tagLevel.getString("Status"));
if (chunkStatus != null)
{
return chunkStatus.getChunkType();
}
return
#if MC_VER <= MC_1_20_4 ChunkStatus.ChunkType.PROTOCHUNK;
#else ChunkType.PROTOCHUNK; #endif
}
private static void readHeightmaps(LevelChunk chunk, CompoundTag chunkData)
{
CompoundTag tagHeightmaps = chunkData.getCompound("Heightmaps");
for (Heightmap.Types type : ChunkStatus.FULL.heightmapsAfter())
{
String heightmap = type.getSerializationKey();
if (tagHeightmaps.contains(heightmap, 12))
chunk.setHeightmap(type, tagHeightmaps.getLongArray(heightmap));
}
Heightmap.primeHeightmaps(chunk, ChunkStatus.FULL.heightmapsAfter());
}
private static void readPostPocessings(LevelChunk chunk, CompoundTag chunkData)
{
ListTag tagPostProcessings = chunkData.getList("PostProcessing", 9);
for (int i = 0; i < tagPostProcessings.size(); ++i)
{
ListTag listTag3 = tagPostProcessings.getList(i);
for (int j = 0; j < listTag3.size(); ++j)
{
#if MC_VER < MC_1_21_3
chunk.addPackedPostProcess(listTag3.getShort(j), i);
#else
chunk.addPackedPostProcess(ShortList.of(listTag3.getShort(j)), i);
#endif
}
}
}
#if MC_VER >= MC_1_18_2
private static BlendingData readBlendingData(CompoundTag chunkData)
{
BlendingData blendingData = null;
if (chunkData.contains("blending_data", 10))
{
@SuppressWarnings({"unchecked", "rawtypes"})
Dynamic<CompoundTag> blendingDataTag = new Dynamic(NbtOps.INSTANCE, chunkData.getCompound("blending_data"));
#if MC_VER < MC_1_21_3
blendingData = BlendingData.CODEC.parse(blendingDataTag).resultOrPartial((message) -> logWarningOnce(message)).orElse(null);
#else
blendingData = BlendingData.unpack(BlendingData.Packed.CODEC.parse(blendingDataTag).resultOrPartial((message) -> logWarningOnce(message)).orElse(null));
#endif
}
return blendingData;
}
#endif
//=====================//
// read chunk lighting //
//=====================//
/**
* https://minecraft.wiki/w/Chunk_format
*/
public static CombinedChunkLightStorage readLight(ChunkAccess chunk, CompoundTag chunkData)
{
#if MC_VER <= MC_1_17_1
// MC 1.16 and 1.17 doesn't have the necessary NBT info
return null;
#else
CombinedChunkLightStorage combinedStorage = new CombinedChunkLightStorage(ChunkWrapper.getInclusiveMinBuildHeight(chunk), ChunkWrapper.getExclusiveMaxBuildHeight(chunk));
ChunkLightStorage blockLightStorage = combinedStorage.blockLightStorage;
ChunkLightStorage skyLightStorage = combinedStorage.skyLightStorage;
boolean foundSkyLight = false;
//===================//
// get NBT tags info //
//===================//
Tag chunkSectionTags = chunkData.get("sections");
if (chunkSectionTags == null)
{
if (!lightingSectionErrorLogged)
{
lightingSectionErrorLogged = true;
LOGGER.error("No sections found for chunk at pos ["+chunk.getPos()+"] chunk data may be out of date.");
}
return null;
}
else if (!(chunkSectionTags instanceof ListTag))
{
if (!lightingSectionErrorLogged)
{
lightingSectionErrorLogged = true;
LOGGER.error("Chunk section tag list have unexpected type ["+chunkSectionTags.getClass().getName()+"], expected ["+ListTag.class.getName()+"].");
}
return null;
}
ListTag chunkSectionListTag = (ListTag) chunkSectionTags;
//===================//
// get lighting info //
//===================//
for (int sectionIndex = 0; sectionIndex < chunkSectionListTag.size(); sectionIndex++)
{
Tag chunkSectionTag = chunkSectionListTag.get(sectionIndex);
if (!(chunkSectionTag instanceof CompoundTag))
{
if (!lightingSectionErrorLogged)
{
lightingSectionErrorLogged = true;
LOGGER.error("Chunk section tag has an unexpected type ["+chunkSectionTag.getClass().getName()+"], expected ["+CompoundTag.class.getName()+"].");
}
return null;
}
CompoundTag chunkSectionCompoundTag = (CompoundTag) chunkSectionTag;
// if null all lights = 0
byte[] blockLightNibbleArray = chunkSectionCompoundTag.getByteArray("BlockLight");
byte[] skyLightNibbleArray = chunkSectionCompoundTag.getByteArray("SkyLight");
// if any sky light was found then all lights above will be max brightness
if (skyLightNibbleArray.length != 0)
{
foundSkyLight = true;
}
for (int relX = 0; relX < LodUtil.CHUNK_WIDTH; relX++)
{
for (int relZ = 0; relZ < LodUtil.CHUNK_WIDTH; relZ++)
{
// chunk sections are also 16 blocks tall
for (int relY = 0; relY < LodUtil.CHUNK_WIDTH; relY++)
{
int blockPosIndex = relY*16*16 + relZ*16 + relX;
byte blockLight = (blockLightNibbleArray.length == 0) ? 0 : getNibbleAtIndex(blockLightNibbleArray, blockPosIndex);
byte skyLight = (skyLightNibbleArray.length == 0) ? 0 : getNibbleAtIndex(skyLightNibbleArray, blockPosIndex);
if (skyLightNibbleArray.length == 0 && foundSkyLight)
{
skyLight = LodUtil.MAX_MC_LIGHT;
}
int y = relY + (sectionIndex * LodUtil.CHUNK_WIDTH) + ChunkWrapper.getInclusiveMinBuildHeight(chunk);
blockLightStorage.set(relX, y, relZ, blockLight);
skyLightStorage.set(relX, y, relZ, skyLight);
}
}
}
}
return combinedStorage;
#endif
}
/** source: https://minecraft.wiki/w/Chunk_format#Block_Format */
private static byte getNibbleAtIndex(byte[] arr, int index)
{
if (index % 2 == 0)
{
return (byte)(arr[index/2] & 0x0F);
}
else
{
return (byte)((arr[index/2]>>4) & 0x0F);
}
}
//=========//
// logging //
//=========//
private static void logBlockDeserializationWarning(ChunkPos chunkPos, int sectionYIndex, String message)
{
LOGGED_ERROR_MESSAGE_MAP.computeIfAbsent(message, (newMessage) ->
{
LOGGER.warn("Unable to deserialize blocks for chunk section [" + chunkPos.x + ", " + sectionYIndex + ", " + chunkPos.z + "], error: ["+newMessage+"]. " +
"This can probably be ignored, although if your world looks wrong, optimizing it via the single player menu then deleting your DH database(s) should fix the problem.");
return newMessage;
});
}
private static void logBiomeDeserializationWarning(ChunkPos chunkPos, int sectionYIndex, String message)
{
LOGGED_ERROR_MESSAGE_MAP.computeIfAbsent(message, (newMessage) ->
{
LOGGER.warn("Unable to deserialize biomes for chunk section [" + chunkPos.x + ", " + sectionYIndex + ", " + chunkPos.z + "], error: ["+newMessage+"]. " +
"This can probably be ignored, although if your world looks wrong, optimizing it via the single player menu then deleting your DH database(s) should fix the problem.");
return newMessage;
});
}
private static void logWarningOnce(String message) { logWarningOnce(message, null); }
private static void logWarningOnce(String message, Exception e)
{
LOGGED_ERROR_MESSAGE_MAP.computeIfAbsent(message, (newMessage) ->
{
LOGGER.warn("Parsing error: ["+newMessage+"]. " +
"This can probably be ignored, although if your world looks wrong, optimizing it via the single player menu then deleting your DH database(s) should fix the problem.",
e);
return newMessage;
});
}
private static RuntimeException logErrorAndReturnException(String message)
{
LOGGED_ERROR_MESSAGE_MAP.computeIfAbsent(message, (newMessage) ->
{
LOGGER.warn("Parsing error: ["+newMessage+"]. " +
"This can probably be ignored, although if your world looks wrong, optimizing it via the single player menu then deleting your DH database(s) should fix the problem.");
return newMessage;
});
// Currently we want to ignore these errors, if returning null is a problem, we can change this later
return null; //new RuntimeException(message);
}
//================//
// helper classes //
//================//
public static class CombinedChunkLightStorage
{
public ChunkLightStorage blockLightStorage;
public ChunkLightStorage skyLightStorage;
public CombinedChunkLightStorage(int minY, int maxY)
{
this.blockLightStorage = ChunkLightStorage.createBlockLightStorage(minY, maxY);
this.skyLightStorage = ChunkLightStorage.createSkyLightStorage(minY, maxY);
}
}
}
@@ -0,0 +1,28 @@
package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject;
#if MC_VER >= MC_1_21_1
import net.minecraft.server.level.GenerationChunkHolder;
import net.minecraft.world.level.ChunkPos;
import java.util.concurrent.CompletableFuture;
public class DhGenerationChunkHolder extends GenerationChunkHolder
{
public DhGenerationChunkHolder(ChunkPos pos) { super(pos); }
@Override
public int getTicketLevel() { return 0; }
@Override
public int getQueueLevel() { return 0; }
#if MC_VER < MC_1_21_3
#else
@Override
protected void addSaveDependency(CompletableFuture<?> completableFuture) { }
#endif
}
#endif
@@ -0,0 +1,469 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject;
import java.lang.invoke.MethodHandles;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.util.LodUtil;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.SpawnerBlock;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Cursor3D;
import net.minecraft.core.SectionPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.WorldGenRegion;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.ColorResolver;
#if MC_VER >= MC_1_17_1
import net.minecraft.world.level.LevelHeightAccessor;
#endif
import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ImposterProtoChunk;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.lighting.LevelLightEngine;
#if MC_VER <= MC_1_20_4
import net.minecraft.world.level.chunk.ChunkStatus;
#else
import net.minecraft.world.level.chunk.status.*;
#endif
#if MC_VER >= MC_1_21_1
import net.minecraft.util.StaticCache2D;
import com.google.common.collect.ImmutableList;
import net.minecraft.server.level.GenerationChunkHolder;
#endif
#if MC_VER >= MC_1_18_2
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.ticks.BlackholeTickAccess;
import net.minecraft.world.ticks.LevelTickAccess;
#endif
public class DhLitWorldGenRegion extends WorldGenRegion
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
private static ChunkStatus debugTriggeredForStatus = null;
public final ServerLevel serverLevel;
public final DummyLightEngine lightEngine;
public final BatchGenerationEnvironment.IEmptyChunkRetrievalFunc generator;
public final int writeRadius;
public final int size;
private final ChunkPos firstPos;
private final List<ChunkAccess> cache;
private final Long2ObjectOpenHashMap<ChunkAccess> chunkMap = new Long2ObjectOpenHashMap<ChunkAccess>();
/**
* Present to reduce the chance that we accidentally break underlying MC code that isn't thread safe,
* specifically: "it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap.getAndMoveToFirst()"
*/
private final ReentrantLock getChunkLock = new ReentrantLock();
#if MC_VER < MC_1_18_2
private ChunkPos overrideCenterPos = null;
public void setOverrideCenter(ChunkPos pos) { overrideCenterPos = pos; }
#if MC_VER < 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 DhLitWorldGenRegion(
int centerChunkX, int centerChunkZ,
ChunkAccess centerChunk,
ServerLevel serverLevel, DummyLightEngine lightEngine,
List<ChunkAccess> chunkList, ChunkStatus chunkStatus, int writeRadius,
BatchGenerationEnvironment.IEmptyChunkRetrievalFunc generator)
{
#if MC_VER == MC_1_16_5
super(serverLevel, chunkList);
#elif MC_VER < MC_1_21_1
super(serverLevel, chunkList, chunkStatus, writeRadius);
#else
super(serverLevel,
StaticCache2D.create(
centerChunkX, centerChunkZ,
writeRadius * 2, (x,z) -> new DhGenerationChunkHolder(new ChunkPos(x, z))),
new ChunkStep(chunkStatus,
// reverse is needed because MC uses the index of the chunkStatus to determine how many items are in the list instead of the actual list count
new ChunkDependencies(ImmutableList.copyOf(ChunkStatus.getStatusList()).reverse()),
new ChunkDependencies(ImmutableList.copyOf(ChunkStatus.getStatusList()).reverse()),
writeRadius, (WorldGenContext var1, ChunkStep var2, StaticCache2D<GenerationChunkHolder> var3, ChunkAccess var4) -> null),
centerChunk);
#endif
this.firstPos = chunkList.get(0).getPos();
this.serverLevel = serverLevel;
this.generator = generator;
this.lightEngine = lightEngine;
this.writeRadius = writeRadius;
this.cache = chunkList;
this.size = Mth.floor(Math.sqrt(chunkList.size()));
}
#if MC_VER >= MC_1_17_1
// Bypass BCLib mixin overrides.
@Override
public boolean ensureCanWrite(BlockPos blockPos)
{
int i = SectionPos.blockToSectionCoord(blockPos.getX());
int j = SectionPos.blockToSectionCoord(blockPos.getZ());
ChunkPos chunkPos = this.getCenter();
ChunkAccess center = this.getChunk(chunkPos.x, chunkPos.z);
int k = Math.abs(chunkPos.x - i);
int l = Math.abs(chunkPos.z - j);
if (k > this.writeRadius || l > this.writeRadius)
{
return false;
}
#if MC_VER >= MC_1_18_2
if (center.isUpgrading())
{
LevelHeightAccessor levelHeightAccessor = center.getHeightAccessorForGeneration();
int minY;
int maxY;
#if MC_VER < MC_1_21_3
minY = levelHeightAccessor.getMinBuildHeight();
maxY = levelHeightAccessor.getMaxBuildHeight();
#else
minY = levelHeightAccessor.getMinY();
maxY = levelHeightAccessor.getMaxY();
#endif
if (blockPos.getY() < minY || blockPos.getY() >= maxY)
{
return false;
}
}
#endif
return true;
}
#endif
#if MC_VER >= MC_1_18_2
@Override
@NotNull
public LevelTickAccess<Block> getBlockTicks()
{
// DH world gen doesn't need ticking, so return the BlackholeTickAccess list (which causes all ticks to be ignored).
// If this isn't done the server may attempt to tick chunks outside the vanilla render distance,
// which can throw warnings or cause other issues
return BlackholeTickAccess.emptyLevelList();
}
@Override
@NotNull
public LevelTickAccess<Fluid> getFluidTicks() { return BlackholeTickAccess.emptyLevelList(); }
#endif
// TODO Check this
// @Override
// public List<? extends StructureStart<?>> startsForFeature(SectionPos sectionPos,
// StructureFeature<?> structureFeature) {
// return structFeat.startsForFeature(sectionPos, structureFeature);
// }
// Skip updating the related tile entities
@Override
public boolean setBlock(BlockPos blockPos, BlockState blockState, int i, int j)
{
ChunkAccess chunkAccess = this.getChunk(blockPos);
if (chunkAccess instanceof LevelChunk)
return true;
chunkAccess.setBlockState(blockPos, blockState, /*isBlockMoving*/false);
// This is for post ticking for water on gen and stuff like that. Not enabled
// for now.
// if (blockState.hasPostProcess(this, blockPos))
// this.getChunk(blockPos).markPosForPostprocessing(blockPos);
return true;
}
// Skip Dropping the item on destroy
@Override
public boolean destroyBlock(BlockPos blockPos, boolean bl, @Nullable Entity entity, int i)
{
BlockState blockState = this.getBlockState(blockPos);
if (blockState.isAir())
{
return false;
}
return this.setBlock(blockPos, Blocks.AIR.defaultBlockState(), 3, i);
}
// Skip BlockEntity stuff. It aren't really needed
@Override
public BlockEntity getBlockEntity(BlockPos blockPos)
{
BlockState blockState = this.getBlockState(blockPos);
// This is a bypass for the spawner block since MC complains about not having it
#if MC_VER >= MC_1_17_1
if (blockState.getBlock() instanceof SpawnerBlock)
{
return ((EntityBlock) blockState.getBlock()).newBlockEntity(blockPos, blockState);
}
else return null;
#else
if (blockState.getBlock() instanceof SpawnerBlock) {
return ((EntityBlock) blockState.getBlock()).newBlockEntity(this);
} else return null;
#endif
}
/**
* This needs to be manually overridden to make sure Lithium 0.11.2 and lower
* don't try to get null chunks. <br><br>
*
* Problematic Lithium code was removed in 0.13.0 (MC 1.21.1) and higher: <br>
* https://github.com/CaffeineMC/lithium-fabric/commit/b7cfd53a1ed0197e1d13dea2799b898eb52ecab3
*/
@NotNull
@Override
public BlockState getBlockState(BlockPos blockPos)
{
int chunkX = SectionPos.blockToSectionCoord(blockPos.getX());
int chunkZ = SectionPos.blockToSectionCoord(blockPos.getZ());
return this.getChunk(chunkX, chunkZ).getBlockState(blockPos);
}
/** Skip BlockEntity stuff. They aren't needed for our use case. */
@Override
public boolean addFreshEntity(@NotNull Entity entity) { return true; }
// Allays have empty chunks even if it's outside the worldGenRegion
// @Override
// public boolean hasChunk(int i, int j) {
// return true;
// }
// Override to ensure no other mod mixins cause skipping the overrided
// getChunk(...)
@Override
public @NotNull ChunkAccess getChunk(int chunkX, int chunkZ)
{
try
{
// lock is to prevent issues with underlying MC code that doesn't support multithreading
this.getChunkLock.lock();
return this.getChunk(chunkX, chunkZ, ChunkStatus.EMPTY);
}
finally
{
this.getChunkLock.unlock();
}
}
// Override to ensure no other mod mixins cause skipping the overrided
// getChunk(...)
@Override
public @NotNull ChunkAccess getChunk(int chunkX, int chunkZ, @NotNull ChunkStatus chunkStatus)
{
try
{
// lock is to prevent issues with underlying MC code that doesn't support multithreading
this.getChunkLock.lock();
ChunkAccess chunk = this.getChunk(chunkX, chunkZ, chunkStatus, true);
if (chunk == null)
{
LodUtil.assertNotReach("getChunk shouldn't return null values");
}
return chunk;
}
finally
{
this.getChunkLock.unlock();
}
}
/** Allows creating empty chunks even if they're outside the worldGenRegion */
@Override
@Nullable
public ChunkAccess getChunk(int chunkX, int chunkZ, @NotNull ChunkStatus chunkStatus, boolean returnNonNull)
{
ChunkAccess chunk = this.getChunkAccess(chunkX, chunkZ, chunkStatus, returnNonNull);
if (chunk instanceof LevelChunk)
{
chunk = new ImposterProtoChunk((LevelChunk) chunk #if MC_VER >= MC_1_18_2 , true #endif );
}
return chunk;
}
/**
* @param returnNonNull if true this method will always return a non-null chunk,
* if false it will return null if no chunk exists at the given position with the given status
*/
private ChunkAccess getChunkAccess(int chunkX, int chunkZ, ChunkStatus chunkStatus, boolean returnNonNull)
{
ChunkAccess chunk = this.superHasChunk(chunkX, chunkZ) ? this.superGetChunk(chunkX, chunkZ) : null;
if (chunk != null && ChunkWrapper.getStatus(chunk).isOrAfter(chunkStatus))
{
return chunk;
}
else if (!returnNonNull)
{
// no chunk found with the necessary status and null return values are allowed
return null;
}
// we need a non-null chunk
if (chunk == null)
{
// check memory
chunk = this.chunkMap.get(ChunkPos.asLong(chunkX, chunkZ));
if (chunk == null)
{
// chunk isn't in memory, generate a new one
chunk = this.generator.getChunk(chunkX, chunkZ);
if (chunk == null)
{
throw new NullPointerException("The provided generator should not return null!");
}
this.chunkMap.put(ChunkPos.asLong(chunkX, chunkZ), chunk);
}
}
if (chunkStatus != ChunkStatus.EMPTY && chunkStatus != debugTriggeredForStatus)
{
LOGGER.info("WorldGen requiring " + chunkStatus
+ " outside expected range detected. Force passing EMPTY chunk and seeing if it works.");
debugTriggeredForStatus = chunkStatus;
}
return chunk;
}
/** Use this instead of super.hasChunk() to bypass C2ME concurrency checks */
public boolean superHasChunk(int x, int z)
{
int k = x - this.firstPos.x;
int l = z - this.firstPos.z;
return l >= 0 && l < this.size && k >= 0 && k < this.size;
}
/** Use this instead of super.getChunk() to bypass C2ME concurrency checks */
private ChunkAccess superGetChunk(int x, int z)
{
int k = x - this.firstPos.x;
int l = z - this.firstPos.z;
return this.cache.get(k + l * this.size);
}
/** Overriding allows us to use our own lighting engine */
@Override
public @NotNull LevelLightEngine getLightEngine() { return this.lightEngine; }
/** Overriding allows us to use our own lighting engine */
@Override
public int getBrightness(@NotNull LightLayer lightLayer, @NotNull BlockPos blockPos) { return 0; }
/** Overriding allows us to use our own lighting engine */
@Override
public int getRawBrightness(@NotNull BlockPos blockPos, int i) { return 0; }
/** Overriding allows us to use our own lighting engine */
@Override
public boolean canSeeSky(@NotNull BlockPos blockPos)
{ return (this.getBrightness(LightLayer.SKY, blockPos) >= LodUtil.MAX_MC_LIGHT); }
public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver)
{ return this.calculateBlockTint(blockPos, colorResolver); }
private Biome _getBiome(BlockPos pos)
{
#if MC_VER >= MC_1_18_2
return this.getBiome(pos).value();
#else
return this.getBiome(pos);
#endif
}
public int calculateBlockTint(BlockPos blockPos, ColorResolver colorResolver)
{
#if MC_VER < MC_1_19_2
int i = (Minecraft.getInstance()).options.biomeBlendRadius;
#else
int i = (Minecraft.getInstance()).options.biomeBlendRadius().get();
#endif
if (i == 0)
return colorResolver.getColor((Biome) _getBiome(blockPos), blockPos.getX(), blockPos.getZ());
int j = (i * 2 + 1) * (i * 2 + 1);
int k = 0;
int l = 0;
int m = 0;
Cursor3D cursor3D = new Cursor3D(blockPos.getX() - i, blockPos.getY(), blockPos.getZ() - i, blockPos.getX() + i, blockPos.getY(), blockPos.getZ() + i);
BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
while (cursor3D.advance())
{
mutableBlockPos.set(cursor3D.nextX(), cursor3D.nextY(), cursor3D.nextZ());
int n = colorResolver.getColor((Biome) _getBiome((BlockPos) mutableBlockPos), mutableBlockPos.getX(), mutableBlockPos.getZ());
k += (n & 0xFF0000) >> 16;
l += (n & 0xFF00) >> 8;
m += n & 0xFF;
}
return (k / j & 0xFF) << 16 | (l / j & 0xFF) << 8 | m / j & 0xFF;
}
}

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