Compare commits

...

361 Commits

Author SHA1 Message Date
s809 4a771a3e21 Restore ordering of session config entries 2024-09-08 21:21:42 +05:00
s809 0aa109a341 Refactor session config 2024-09-08 19:05:47 +05:00
s809 6d44255175 Fix crash on F3 when commit hash was failed to retrieve 2024-09-07 21:47:45 +05:00
s809 f8bb35cb2b Fix compilation on older versions 2024-09-06 00:12:09 +05:00
s809 52f1aed124 Fix client crashing 2024-09-05 23:45:08 +05:00
s809 6ae1ba1e17 Prefill levelKeyPrefix in new worlds 2024-09-05 14:22:08 +05:00
s809 9105f30fec Fix compilation 2024-09-04 22:53:06 +05:00
s809 839c849a9d Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into serverside 2024-09-04 18:22:52 +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
s809 275f507096 Limit number of retries on request errors
Add a delay if rate limit is hit
2024-09-02 15:31:43 +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
s809 01c5a4072a Delay loading first level when on server 2024-08-31 20:47:03 +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
s809 1697707114 Restore LOD fetching by distance 2024-08-29 17:09:13 +05:00
James Seibel 9fb3b196d2 Add a quick DH cloud UI config 2024-08-28 07:16:33 -05:00
s809 34b0b7dc31 Print entire buffer in log 2024-08-28 16:19:17 +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
s809 691e1022e3 Do not start generator until server responds with config 2024-08-27 16:35:27 +05:00
s809 18fd157474 Show incompatible protocol version in F3 2024-08-27 16:02:26 +05:00
s809 4948158fa8 Fix sync on login 2024-08-26 16:54:05 +05:00
s809 e3b972c928 Fix missing mixins in (Neo-)Forge 2024-08-24 12:07:13 +05:00
s809 ad056cb64e Fix compilation 2024-08-24 03:06:29 +05:00
s809 3e22ddead5 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into serverside 2024-08-24 02:59:56 +05:00
s809 5c7e27c52d Fix network compression pool not shutting down 2024-08-23 17:11:37 +05:00
s809 3a5c6f12c0 Add back Forge packet ID in pre-1.20.6 2024-08-23 14:51:09 +05:00
s809 627eee7a6d "Fix" buffer release errors in FullDataPayload 2024-08-23 14:16:35 +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
s809 7c4c99089b Use same packet resource for all versions 2024-08-19 17:56:34 +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
s809 00ec14d319 Add logging of request group lifecycle 2024-08-15 15:47:13 +05:00
s809 56188bc7d2 Fix colors in verifyall.ps1 2024-08-14 13:29:32 +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
s809 9b2429d388 Fix compilation 2024-08-11 21:21:15 +05:00
s809 2aa68ec41d Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into serverside 2024-08-11 20:59:39 +05:00
James Seibel 398a3fb0bc Add alex's cave warning message 2024-08-11 09:55:12 -05:00
s809 13c9f95750 Fix compilation 2024-08-11 00:53:12 +05:00
s809 b0549cecff Do not clear keyed level on close event 2024-08-10 23:53:33 +05:00
s809 95fb4a0e6a Make encode/decode error handling work correctly 2024-08-10 23:26:09 +05:00
s809 2a3aadc2fa Make error handling somewhat work 2024-08-10 19:49:40 +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
s809 52bddca0df Merge branch 'serverside-experimental/prevent-disconnects' into serverside 2024-08-07 22:20:39 +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
s809 606dede9ef Fix real-time updates 2024-08-06 23:12:18 +05:00
s809 e8c9d8391a Fix Neoforge not being able to connect to vanilla servers 2024-08-05 14:51:32 +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
s809 88ca223bbc Fix dimension switching (untested) 2024-08-03 15:43:19 +05:00
s809 4a51bbc796 [skip ci] Prevent disconnects on encode/decode/handle errors 2024-08-01 22:19:21 +05:00
s809 94ca0e2729 Increase defaults for network compression threads 2024-07-30 10:52:32 +05:00
s809 5befdbcddc Use FullDataPayload instead of reusing messages 2024-07-29 13:10:11 +05:00
s809 3e02d7f9dc Add build number on F3 screen 2024-07-28 20:19:41 +05:00
s809 48b38d9285 Fix compilation 2024-07-28 19:58:35 +05:00
s809 8c7c787a8f Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into serverside 2024-07-28 19:44:46 +05:00
s809 fc0cf56b48 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into serverside 2024-07-28 19:01:35 +05:00
s809 32c63ae15b Reapply "Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into serverside"
This reverts commit a2d5e8cdb3.
2024-07-28 17:06:36 +05:00
s809 bbf62f7ee3 Add verifyall.ps1 2024-07-27 23:09:46 +05:00
s809 6211542708 Update core 2024-07-27 23:08:45 +05:00
s809 a2d5e8cdb3 Revert "Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into serverside"
This reverts commit 692b304898, reversing
changes made to 0ca93e311c.
2024-07-27 23:07:43 +05:00
s809 692b304898 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into serverside 2024-07-27 21:43:54 +05:00
s809 0ca93e311c Fix handler registration 2024-07-20 23:56:34 +05:00
s809 c7aab012ae Update core 2024-07-17 00:02:22 +05:00
s809 80ccab21da Fix level handling for real time updates 2024-07-12 23:11:40 +05:00
s809 663ce3cde6 Add cache for ignoring responses for cancelled requests 2024-07-11 23:06:26 +05:00
s809 43fee18ae4 Clean up a bit 2024-07-11 22:08:21 +05:00
s809 014310631e Fix player tracking on server 2024-07-10 23:51:49 +05:00
s809 4f7e934c98 Add missing semaphore release 2024-07-09 18:06:20 +05:00
s809 563dcd7de6 Prevent request cancellation deadlock 2024-07-09 14:47:49 +05:00
s809 0a5cc734de Use dedicated thread pool for data compression 2024-07-08 23:08:04 +05:00
s809 0da158fecc Disable parent update propagation 2024-07-07 19:46:52 +05:00
s809 a7e8bbaf6a Reset state of level detection on world exit 2024-07-07 01:49:47 +05:00
s809 80732943c8 Repoint core to main repo 2024-07-01 14:20:34 +05:00
s809 994c86d5ba Make data source encoding lazy and move it off server thread 2024-07-01 00:16:00 +05:00
s809 18ccbbbb8e Move fixing the dimension name into even more correct place 2024-06-28 23:18:34 +05:00
s809 31c3fb9a1e Move fixing the dimension name into correct place 2024-06-28 19:28:40 +05:00
s809 8bdb383b2e Fix paths unable to be created on Windows 2024-06-28 17:25:18 +05:00
s809 d13ec687ed Fix test compilation failing 2024-06-28 15:52:51 +05:00
s809 43069703cd Update core 2024-06-28 15:44:06 +05:00
s809 6d76ace604 Use level's ResourceLocation instead of dimension type's 2024-06-28 15:35:28 +05:00
s809 9b139575e7 Clean up package structure 2024-06-26 23:57:50 +05:00
s809 efb9129edf Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into refactor/remove-tcp-connection 2024-06-26 15:13:22 +05:00
s809 6a380f6a7b Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into refactor/remove-tcp-connection 2024-06-26 14:55:39 +05:00
s809 0798ca01c5 Force GradleVanilla version 2024-06-21 13:49:18 +05:00
s809 8bfc1430c8 Put messages received before player joining into queue 2024-06-16 00:45:23 +05:00
s809 bd6621183d Avoid reloading levels when unnecessary 2024-06-14 16:25:25 +05:00
s809 ccc8076c66 Use level keys 2024-06-13 16:44:43 +05:00
s809 004103551f Prevent disconnection on decode failure 2024-06-10 23:55:33 +05:00
s809 ea47e11ecf Show dimension names 2024-06-10 23:40:01 +05:00
s809 8a3837b04b Better error on invalid dimension 2024-06-09 22:01:32 +05:00
s809 edfeaa618b Restore old cache key 2024-06-09 21:35:05 +05:00
s809 961cdbe868 Fix indent 2024-06-09 21:21:26 +05:00
s809 ff6ab67b69 Change job name 2024-06-09 21:19:39 +05:00
s809 c01fb4a716 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into refactor/remove-tcp-connection 2024-06-09 21:18:18 +05:00
s809 8bd524791f Use message wrapper in forge 2024-06-09 14:31:15 +05:00
s809 26059d5656 Fix logging errors 2024-06-08 00:07:33 +05:00
s809 3f23281e8d Add toString to messages & fix incorrect call 2024-06-06 21:25:32 +05:00
s809 fb25423deb Fix compilation for older versions 2 2024-06-05 21:17:21 +05:00
s809 6928c8dc28 Fix compilation for older versions 2024-06-04 23:33:44 +05:00
s809 7dfe0e4c50 Fix compilation 2024-06-02 20:00:16 +05:00
s809 1429ae5434 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into refactor/remove-tcp-connection 2024-06-02 19:59:34 +05:00
s809 3fb4d5a233 Increase section reload delay 2024-06-01 19:49:27 +05:00
s809 872226e5c5 Fix requests breaking on rejoining 2024-06-01 12:17:08 +05:00
s809 fb46820b1f Kinda works, rejoining is broken 2024-05-29 23:36:38 +05:00
s809 a786678bcb [skip ci] Incomplete 2024-05-21 22:55:06 +05:00
s809 0d35a3ea8e Move overrides in LAN to config 2024-05-18 22:14:01 +05:00
s809 6f87e22048 Fix forge config loading too late 2024-05-17 23:02:36 +05:00
s809 7c07c1e5bd Fix awt dependency error 2024-05-12 17:35:01 +05:00
s809 4ddb9659f5 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into feature/2.0.4 2024-05-11 19:17:13 +05:00
s809 e74b8c89ba Fix levels not unloading on forge 2024-05-11 18:38:25 +05:00
s809 1b536e4aef Fix compilation 2024-05-11 17:51:00 +05:00
s809 335f11acd3 Fix dimension switching (at cost of breaking immersive portals) 2024-05-10 23:56:15 +05:00
s809 b55b560cce Update core 2024-05-10 21:15:46 +05:00
s809 d87a152052 Fix generated sections not appearing 2024-05-10 21:15:02 +05:00
s809 db5a9c7c84 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons into feature/2.0.4 2024-05-05 19:51:32 +05:00
s809 2508efdd91 Fix updates 2024-05-05 16:55:20 +05:00
s809 4852720e14 Generation works, updates don't 2024-05-03 22:56:07 +05:00
s809 f39d156b11 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-05-02 21:47:42 +05:00
s809 e21eb61335 Fix 1.16.5 and 1.17.1 builds 2024-04-17 21:02:19 +05:00
s809 c49f385e3c Update core 2024-04-16 22:00:10 +05:00
s809 0584b0e593 Fix integer overflows 2024-04-12 23:15:02 +05:00
s809 220ac89ad8 Fix Neoforge 2024-04-12 22:38:21 +05:00
s809 e8e56b66a3 Merge branch 'feature/plugin-channel' 2024-04-02 22:35:28 +05:00
s809 634d8a5b52 Remove localhost from check 2024-04-02 22:27:44 +05:00
s809 b621c9fb8d Some small changes 2024-04-02 21:55:59 +05:00
s809 696f84a064 Fix compilation 2024-04-01 21:52:25 +05:00
s809 5c13ff8960 Fix errors when on vanilla server 2024-04-01 00:55:23 +05:00
s809 e102cd78cd Fix reconnection logic 2024-03-30 23:40:17 +05:00
s809 c5a782acba Fix broken mod compat on server 💀 2024-03-28 09:24:57 +05:00
s809 2008ea2b0c Incomplete 2024-03-26 00:31:13 +05:00
s809 0f349461d9 Fix Forge 2024-03-18 21:38:08 +05:00
s809 baf464aa02 Add thread pool task buildup limiter 2024-03-16 12:28:42 +05:00
s809 51d83d803a [no ci] Incomplete fix forge 2024-03-16 11:22:52 +05:00
s809 2b3244159b Server side plugin networking
Untested port for Forge
2024-03-14 21:46:33 +05:00
s809 9255c22d0e Fix world setting 2024-03-10 21:11:04 +05:00
s809 4d573c4aea Initial buggy plugin channel support 2024-03-05 22:10:05 +05:00
s809 a59f359133 Do not wait for world gen tasks to stop while shutting down queue 2024-02-25 18:05:50 +05:00
s809 c83d02c30c Always print git info 2024-02-25 13:11:37 +05:00
s809 d01573b03e Show server side messages in F3 on disconnect 2024-02-25 00:40:31 +05:00
s809 b1fb74539f Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-02-22 23:06:40 +05:00
s809 40962ec9ba Use separate build caches 2024-02-15 19:22:29 +00:00
s809 0515ac2919 Fix immersive portals 2024-02-15 23:15:11 +05:00
s809 8072695391 Fix connection exception handling 2024-02-13 22:26:24 +05:00
s809 2c140bf7d7 Fix compilation 2024-02-12 21:39:52 +05:00
s809 d3e88b40f4 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-02-12 21:39:04 +05:00
s809 5e0e15777c Add another config option
Fix rate limiting issues (kinda)
2024-02-11 19:39:42 +05:00
s809 b57fc5c9aa Fix compilation 2024-02-08 20:44:46 +05:00
s809 91ea68075e Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-02-08 20:39:21 +05:00
s809 0840ec8b00 Update core 2024-02-07 21:03:48 +05:00
s809 d9f37ad7d6 Fix compilation 2024-02-07 21:03:37 +05:00
s809 992a7129e5 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-02-07 20:50:06 +05:00
s809 1d5ea329de Remove unused packets 2024-02-04 21:58:01 +05:00
s809 00d0a0d2fc Fix queue not filled when generation is toggled 2024-02-04 21:00:06 +05:00
s809 95d4314982 Merge remote-tracking branch 'origin/main' 2024-02-04 02:36:31 +05:00
s809 b588b937ea Update core 2024-02-04 02:35:30 +05:00
s809 f524ad027e Fix editorconfig 2024-02-03 22:38:27 +05:00
s809 b3111b9548 Update core 2024-02-02 05:57:32 +00:00
s809 6c38cb3dee Limit rate+concurrency instead of only concurrency
Rename post-relog update to Login sync
2024-01-29 22:36:21 +05:00
s809 d75b2dfc1c Update core 2024-01-28 22:40:43 +05:00
s809 a5b44d65c6 Change retry a bit 2024-01-28 22:40:36 +05:00
s809 7a1c61405c Retry failed jobs 2024-01-27 19:48:58 +05:00
s809 bcb8794d30 Post-relog updates 2024-01-27 19:45:38 +05:00
s809 f9775b115e Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-01-21 17:20:55 +05:00
s809 a56a2c2ba3 Fix compilation on <1.18.2 2024-01-16 20:28:48 +05:00
s809 b2efb33a5b Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-01-16 20:20:31 +05:00
s809 5928cfe4b4 Fix compilation 2024-01-16 20:18:32 +05:00
s809 234204590f Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-01-16 20:17:48 +05:00
s809 e3838c560a Fix Neoforge compilation 2024-01-13 20:36:12 +05:00
s809 6cbc9db1d8 Disable API and pages compilation 2024-01-13 20:32:25 +05:00
s809 127dcfcb46 Fix generation 2024-01-13 19:44:54 +05:00
s809 d1abdd822d Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-01-13 16:53:04 +05:00
s809 85b7ccb38e Fix crash when changing config while disconnected 2024-01-13 16:11:08 +05:00
s809 fc157b738e Remove Netty from jar and use one from MC instead 2024-01-13 16:11:08 +05:00
s809 977afffe98 Merge branch 'main' of https://gitlab.com/s809/minecraft-lod-mod 2024-01-11 23:34:21 +05:00
s809 180b22f21a Fix cast exception on changing dimensions
(I missed the fact that there's a method for obtaining level without weird hoops 💀)
2024-01-11 23:32:34 +05:00
s809 d0330ad62f Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2024-01-08 17:50:10 +05:00
s809 4d22b18f3c Refactor initializer code 2024-01-07 20:25:34 +05:00
s809 df797b240e Fix 1.16.5 and 1.17.1 builds 2024-01-05 22:37:32 +05:00
s809 a50ef86302 Update core 2024-01-05 22:08:50 +05:00
s809 4aede27d75 Forge versions are functional 2024-01-04 17:36:27 +05:00
s809 e616c63ebe [skip ci] Remove unnecessary build line 2024-01-02 21:03:03 +05:00
s809 03ec333a26 Fix forge builds
Server side is not functional yet
2024-01-02 20:47:11 +05:00
s809 27446965db Make 1.16.5 build
Make Netty version specific for each MC version
2023-12-30 21:57:03 +05:00
s809 c6d7313225 Fix fix 2023-12-29 18:42:10 +00:00
s809 160912a17a Fix 1.19.2 build 2023-12-29 21:13:17 +05:00
s809 d408aacbc8 Fix 1.19.2 build 2023-12-29 21:11:19 +05:00
s809 4889287e69 Start porting to previous versions 2023-12-29 20:31:07 +05:00
s809 6acdfabb7f Update core 2023-12-28 18:59:49 +05:00
s809 3c01d00772 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2023-12-28 18:59:15 +05:00
s809 736bb022d2 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2023-12-24 19:16:16 +05:00
s809 e92130d6cc Merge branch 'main' of https://gitlab.com/s809/minecraft-lod-mod 2023-12-21 19:29:38 +05:00
s809 a44dfa92a6 Update core 2023-12-21 19:29:17 +05:00
s809 4c8ee862e5 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2023-12-21 12:25:02 +05:00
s809 73b89fe573 Disable not working versions 2023-12-19 18:37:14 +00:00
s809 fed2600dbe Add protection against hang on shutdown 2023-12-19 23:20:30 +05:00
s809 1d7d94cfec Update core 2023-12-18 23:15:44 +05:00
s809 5577261774 Update wipe script
Update core
2023-12-18 23:11:47 +05:00
s809 bf0f3131a0 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2023-12-18 19:27:24 +05:00
s809 1b98ea59d7 Remove current post-relog update feature 2023-12-18 19:14:05 +05:00
s809 c38efd9d6b Fix 1.20.1 compilation 2023-12-15 22:31:58 +05:00
s809 4889119061 Merge branch 'main' of https://gitlab.com/s809/minecraft-lod-mod 2023-12-15 21:00:54 +05:00
s809 accb2d6af3 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2023-12-15 20:31:50 +05:00
s809 24b426a17b Disable building of forge jars 2023-12-06 17:24:32 +00:00
s809 8c1bccb430 Update core 2023-12-06 22:07:06 +05:00
s809 3cb2a70f4d Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2023-12-06 21:17:16 +05:00
s809 a313cb3db1 Fix Double missing from console command argument types 2023-11-29 22:39:16 +05:00
s809 c29c6d1870 Fix configs loading too late on server 2023-11-29 22:25:38 +05:00
s809 b4a64b0c3d Update core 2023-11-28 00:06:48 +05:00
s809 1439ca5c08 Remove unnecessary log 2023-11-26 21:34:07 +05:00
s809 97ad3bc78f Update core 2023-11-25 18:05:02 +05:00
s809 b59d8cff8d Fix command response not displayed in chat 2023-11-25 18:04:53 +05:00
s809 0e93aa4aea Basic chat commands 2023-11-25 17:44:52 +05:00
s809 28f8099777 Dummy chat command 2023-11-23 20:58:47 +05:00
s809 c83b0ae533 Sync core 2023-11-20 17:43:09 +05:00
s809 5ceeebe567 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons 2023-11-19 22:57:14 +05:00
s809 e8db9803be Bandaid fix to prevent duplicate section requests 2023-11-12 17:18:39 +05:00
s809 f009fd41ab Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-11-11 19:20:50 +05:00
s809 9faa3b0a54 Do not update client light on a dedicated server 2023-11-04 16:39:23 +05:00
s809 0e70478dd3 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-11-03 21:23:37 +05:00
s809 309b6c6013 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-10-30 15:26:43 +05:00
s809 f20af18b62 Make post-relog update independent from generation toggle 2023-10-23 23:18:57 +05:00
Steveplays28 7d3329fd98 chore: Add missing language entries for the server networking config 2023-10-20 14:07:59 +02:00
Steveplays28 9a880c3ab1 style: Rename renderDistance to renderDistanceRadius to stay in sync with the main config 2023-10-20 14:03:28 +02:00
Steveplays28 0b247f04b4 fix: Fix getting LOD render distance radius from the config
This config option was renamed recently, to fix LODs not rendering out to the LOD render distance border. Also removed an unused import.
2023-10-20 13:50:03 +02:00
Steveplays28 7f1d664731 Merge branch 'main-upstream'
# Conflicts:
#	coreSubProjects
2023-10-20 13:41:50 +02:00
s809 a2288d740b Fix compilation 2023-10-14 22:13:22 +05:00
s809 958f0347a3 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-10-14 22:09:31 +05:00
s809 859bb2e34e Fix compilation 2023-09-28 23:28:23 +05:00
s809 a2acd08e0d Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-09-28 22:54:51 +05:00
Steveplays28 b986583fc4 Merge branch 'main-upstream'
# Conflicts:
#	coreSubProjects
#	fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java
2023-09-27 14:10:44 +02:00
s809 c6355f96a6 Improve management of frequent real time updates 2023-09-26 22:03:17 +05:00
s809 723d171746 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-09-26 11:40:59 +05:00
s809 63098d8519 Fix unloaded file check 2023-09-24 18:48:18 +05:00
Steveplays28 44b743267b fix: Fix compiling after merge 2023-09-24 11:34:04 +02:00
Steveplays28 720155c408 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	coreSubProjects
2023-09-24 11:28:43 +02:00
Steveplays28 334b487e23 Merge branch 'main-upstream'
# Conflicts:
#	coreSubProjects
#	fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java
2023-09-24 11:26:12 +02:00
s809 6e674f3732 Add gen task rate display 2023-09-24 14:24:38 +05:00
Steveplays28 d130a602d6 Merge remote-tracking branch 'origin/main' 2023-09-23 16:34:08 +02:00
Steveplays28 8d1ff02937 feat: Add config option for server port 2023-09-23 16:33:42 +02:00
s809 15b1603e35 Fix compiling
Remove unused config category
Use pooling when receiving sections
Fix use of real time update config
Fix debug renderer not unregistered on queue close
2023-09-23 15:32:37 +05:00
s809 4ad0a22db7 Update core 2023-09-21 21:05:31 +05:00
s809 35bc1df32c Add config for a few slow features 2023-09-21 21:00:35 +05:00
s809 bb2a1158c2 Move context levels to requests 2023-09-21 10:16:42 +05:00
s809 76f6f6f746 Allow selecting specific IDebugRenderable's for rendering 2023-09-19 21:33:05 +05:00
s809 3b771b5300 Validate response types 2023-09-19 20:19:31 +05:00
s809 9497918e06 Fix chunk updates sent to incomplete connections
Hide useless warns, for cases when listener is not configured yet
2023-09-19 18:58:16 +05:00
s809 e52c5d5c67 Fix chunk updates sent to incomplete connections
Hide useless warns, for cases when listener is not configured yet
2023-09-19 18:57:55 +05:00
s809 1ce4750dfc Fix future id collisions between c<->s
(cause of occasional hangs on disconnection)
Add packet trace logging
2023-09-19 17:28:49 +05:00
s809 2b371340ff Fix compiling 2023-09-18 13:44:25 +05:00
s809 e8d906b407 Update core 2023-09-18 13:25:06 +05:00
s809 572973c69a Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-09-18 13:24:48 +05:00
Steveplays28 9f2d6b9c78 Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	coreSubProjects
2023-09-12 17:35:49 +02:00
s809 54277040e9 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-09-10 12:03:44 +05:00
Steveplays28 bbe333fab7 fix: Fix missing IServerKeyedClientLevel import 2023-09-09 21:03:40 +02:00
Steveplays28 37fed5a924 Merge branch 'main-upstream'
# Conflicts:
#	coreSubProjects
#	forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java
2023-09-09 20:54:59 +02:00
Steveplays28 5fc29334cd Merge branch 'main-upstream'
# Conflicts:
#	coreSubProjects
2023-09-09 14:47:18 +02:00
Steveplays28 9d32e92e0a Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	coreSubProjects
2023-09-08 19:55:04 +02:00
s809 b08ee76a00 Fix compiling 2023-09-07 21:07:20 +05:00
s809 2a4cc6e63d Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-09-07 20:07:42 +05:00
s809 6b2560f98b Add post-rejoin updates 2023-09-02 01:30:54 +05:00
s809 08111d8874 Fix compilation 2023-08-27 19:56:32 +05:00
s809 80f48cd5a4 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-08-27 19:43:13 +05:00
s809 40cd6c1386 Fix loading ClientLevel on server 2023-08-27 18:42:07 +05:00
s809 e9a13dffb8 Update core 2023-08-26 21:34:46 +05:00
s809 22680baad7 Merge branch 'feat/server-updates' 2023-08-24 01:01:48 +05:00
s809 cca480e5d8 Merge branch 'main' of https://gitlab.com/s809/minecraft-lod-mod 2023-08-24 00:03:55 +05:00
s809 249c3423d9 Update core 2023-08-24 00:02:53 +05:00
s809 15cb6468d9 Update core 2023-08-23 23:55:48 +05:00
s809 f24019d648 Update core 2023-08-22 20:42:06 +05:00
s809 733d03c630 test 2023-08-22 20:41:42 +05:00
s809 c3e84648f1 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod into feat/server-updates 2023-08-22 19:12:56 +05:00
Steveplays28 76c33b6b58 fix: Add null check to config GUI when adding a screen change listener 2023-08-22 10:52:18 +02:00
s809 26a947ea13 Incomplete 2023-08-21 22:09:16 +05:00
Steveplays28 91334c0e5c 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-21 03:41:26 +02:00
s809 172b05aeac Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-08-19 23:45:16 +05:00
s809 b84e5ca265 Fix hang when near completion of loading from server
Replace total value with sum of pending+finished requests
2023-08-19 22:21:27 +05:00
s809 20ef5a10fc Fix hang when near completion of loading from server
Replace total value with sum of pending+finished requests
2023-08-19 22:21:01 +05:00
s809 33640fd35d Fix prioritization not working properly 2023-08-19 21:24:40 +05:00
s809 e5f7c5728f Fix prioritization not working properly 2023-08-19 21:22:51 +05:00
Steveplays28 5a9bbf9829 Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	coreSubProjects
2023-08-19 11:42:09 +02:00
Steveplays28 23ca022ee9 Merge remote-tracking branch 'upstream/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
2023-08-18 15:11:59 +02:00
Steveplays28 6c80165523 chore: Remove username from Fabric build script 2023-08-18 15:08:48 +02:00
s809 d598061fa7 Add missing level wrapper argument (and a bunch of null checks) 2023-08-18 15:04:49 +02:00
Steveplays28 02498aa189 fix: Fix index out of bounds errors and LOD pillars
The `BiomeWrapper#equals` and `BlockStateWrapper#equals` methods didn't use the right `LevelWrapper` for serializing the object to compare to, this is now fixed.
2023-08-16 13:25:23 +02:00
Steveplays28 d535f6aa57 fix: Comment out leftover Immersive Portals compat
A bit I didn't notice while making the previous commit.
2023-08-16 11:42:02 +02:00
Steveplays28 933753a38a fix: Comment out Immersive Portals compat
The renderer compat was commented out in upstream, but the rest of the compat wasn't commented out, or lost in a merge.
2023-08-16 11:40:46 +02:00
Steveplays28 5483cdbc51 refactor: Update to Sodium 0.5.1
This reverts commits 815aed53 and 21144a7c.
2023-08-15 16:18:05 +02:00
Steveplays28 1ea62fd5ec Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java
#	coreSubProjects
#	fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java
#	forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java
2023-08-15 15:55:33 +02:00
Steveplays28 aaf0361c50 fix: Fix BlockStateWrapper and Biome serializing to empty strings 2023-08-15 00:03:12 +02:00
Steveplays28 a08feebde0 fix: Fix server trying to access client instance 2023-08-14 19:23:57 +02:00
Steveplays28 f7131fd2ca fix: Fix 1.20.1 compilation 2023-08-14 15:44:45 +02:00
Steveplays28 2100f4a6fe Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java
#	coreSubProjects
2023-08-14 15:40:31 +02:00
Steveplays28 996f097b9d refactor: Re-add old serialization method
This is used by some override methods that don't have access to the level.
These old serialization methods have `FIXME`s so they're easy to find in the future.
2023-08-13 23:18:52 +02:00
Steveplays28 2e1d737268 Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java
#	common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java
#	coreSubProjects
2023-08-13 22:34:07 +02:00
s809 d374870fb7 Generation task prioritization (loaded > unloaded > ungenerated) 2023-08-13 18:59:42 +05:00
s809 5c303df32c Update core 2023-08-13 01:53:45 +05:00
s809 dfc4b51e89 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-08-13 01:53:22 +05:00
s809 765202d582 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-08-08 20:58:21 +05:00
s809 0d2e5adbed Skip version if step failed in buildAll 2023-08-08 20:30:19 +05:00
s809 68e9d64779 Fix compiling (except 1.16.5 & 1.17.1) 2023-08-08 20:25:07 +05:00
s809 b64b44f301 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-08-08 12:48:37 +05:00
s809 8c07bb37f3 Update core 2023-08-05 22:30:50 +05:00
s809 c1f6c2dbbd Split fabric run folder into server and client 2023-08-05 22:30:02 +05:00
s809 2eb1c16837 Add Fabric run configurations 2023-08-05 22:29:09 +05:00
s809 e5fb8477d3 Update core 2023-08-04 22:12:28 +05:00
s809 428cacd262 Update core 2023-08-04 21:52:26 +05:00
s809 76926d38db Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-08-04 21:11:03 +05:00
s809 9fec679b03 Attempt to fix dimension switching 2023-08-01 17:04:40 +05:00
s809 853a1d1490 Update core 2023-08-01 12:55:53 +05:00
s809 01273e31bc Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-07-31 17:43:45 +05:00
s809 ebb4808bdc Avoid losing requests due to concurrency 2023-07-31 17:42:59 +05:00
s809 fd09adb1a7 World generation 2023-07-31 15:24:33 +05:00
s809 82b7b439a4 Update core 2023-07-24 19:16:21 +05:00
s809 f1b3ae120b something 2023-07-24 19:16:05 +05:00
s809 70ee20e817 Implement transferring of missing full data source types 2023-07-24 14:15:03 +05:00
s809 f713d65f9c Update core 2023-07-24 11:01:20 +05:00
s809 c2b98ef694 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-07-24 10:48:28 +05:00
s809 140c9f6a50 Update core 2023-07-24 10:48:14 +05:00
s809 c704d61d03 Update core 2023-07-24 01:46:31 +05:00
s809 aae484fbdf Update core 2023-07-23 23:48:58 +05:00
s809 a546a97e34 Got chunks to generate on server 2023-07-23 20:34:40 +05:00
s809 3ca9d98c05 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-07-23 11:09:07 +05:00
s809 460b73e35c Update core 2023-07-19 22:29:49 +05:00
Steveplays28 8901a191d9 feat: Implement syncing of DhSectionPos for chunk requests/responses 2023-07-19 16:49:31 +02:00
s809 1bbe35c9f1 Update core 2023-07-19 17:41:06 +05:00
s809 f92e957826 Update core 2023-07-19 15:54:45 +05:00
s809 636e6736a3 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-07-19 12:21:35 +05:00
s809 8e29f65815 Update core 2023-07-19 12:19:54 +05:00
s809 a9309078f3 Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod 2023-07-16 12:48:39 +05:00
s809 9692e978de Update core 2023-07-16 12:38:49 +05:00
s809 914372b858 Repoint back to fork 2023-07-15 23:12:30 +05:00
100 changed files with 2173 additions and 734 deletions
+2 -2
View File
@@ -538,7 +538,7 @@ 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
indent_size = 2
ij_json_array_wrapping = split_into_lines
ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false
@@ -688,7 +688,7 @@ ij_markdown_wrap_text_inside_blockquotes = true
ij_toml_keep_indents_on_empty_lines = false
[{*.yaml,*.yml}]
indent_size = 4
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
+9 -4
View File
@@ -18,19 +18,24 @@ variables:
.build_java:
#image: eclipse-temurin:17
cache:
key: "gradleCache"
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"]
- 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"]
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/;
@@ -63,7 +68,7 @@ build:
extends: .build_java
api:
.api:
stage: api
needs: []
script:
@@ -87,7 +92,7 @@ api:
# generate and publish API javadocs
pages:
.pages:
stage: pages
needs: []
script:
+1 -1
View File
@@ -1,3 +1,3 @@
[submodule "coreSubProjects"]
path = coreSubProjects
url = https://gitlab.com/jeseibel/distant-horizons-core.git
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>
+20 -20
View File
@@ -27,8 +27,8 @@ def writeBuildGradlePredefine(List<String> mcVers, int mcIndex)
StringBuilder sb = new StringBuilder();
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(".", "_");
@@ -104,7 +104,7 @@ subprojects { p ->
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"))
@@ -118,7 +118,7 @@ subprojects { p ->
manifold {
manifoldVersion = rootProject.manifold_version
}
// set up custom configurations (configurations are a way to handle dependencies)
configurations {
@@ -191,7 +191,7 @@ subprojects { p ->
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")
@@ -201,25 +201,24 @@ subprojects { p ->
// 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
// Breaks 1.16.5
//forgeShadowMe("io.netty:netty-all:${rootProject.netty_version}")
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}") {
@@ -277,7 +276,7 @@ subprojects { p ->
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
@@ -291,11 +290,11 @@ subprojects { p ->
// Compression (LZ4)
relocate "net.jpountz", "${librariesLocation}.jpountz"
// Sqlite Database
//At the moment, there is a bug in this library which doesnt allow it to be relocated
// relocate "org.sqlite", "${librariesLocation}.sqlite"
// JOML
if (project.hasProperty("embed_joml") && embed_joml == "true")
relocate "org.joml", "${librariesLocation}.joml"
@@ -305,9 +304,10 @@ subprojects { p ->
// SVG (not needed atm)
// relocate "com.kitfox.svg", "${librariesLocation}.kitfox.svg"
// Netty
relocate "io.netty", "${librariesLocation}.netty"
// Don't relocate, it causes problems with using MC's FriendlyByteBufs
// relocate "io.netty", "${librariesLocation}.netty"
mergeServiceFiles()
}
@@ -329,7 +329,7 @@ subprojects { p ->
"META-INF/neoforge.mods.toml",
// The mixins for each of the loaders
"DistantHorizons."+ p.name +".fabricLike.mixins.json"
"DistantHorizons." + p.name + ".fabricLike.mixins.json"
]
def intoTargets = ["$buildDir/resources/main/"] // Location of the built resources folder
@@ -388,14 +388,14 @@ subprojects { p ->
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 {
@@ -639,4 +639,4 @@ task cleanMergedJars() {
}
}
// add cleanMergedJars to the end of the "clean" task
tasks["clean"].finalizedBy(cleanMergedJars)
tasks["clean"].finalizedBy(cleanMergedJars)
+12 -6
View File
@@ -1,7 +1,8 @@
#!/bin/sh
echo "==================== Note: All build jars will be in the folder called 'buildAllJars' ===================="
mkdir -p buildAllJars | true
mkdir -p buildAllJars
rm -rf buildAllJars/*
# Loop trough everything in the version properties folder
for d in versionProperties/*; do
@@ -11,12 +12,17 @@ for d in versionProperties/*; do
# 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 --no-daemon || true
sh gradlew clean -PmcVer=$version
if [ $? != 0 ]; then continue; fi
echo "====================Building $version ===================="
sh gradlew build -PmcVer=$version --no-daemon || true
sh gradlew build -PmcVer=$version
if [ $? != 0 ]; then continue; fi
echo "==================== Merging $version ===================="
sh gradlew mergeJars -PmcVer=$version --no-daemon || true
sh gradlew mergeJars -PmcVer=$version
if [ $? != 0 ]; then continue; fi
echo "==================== Moving jar ===================="
mv Merged/*.jar buildAllJars/ || true
# The "| true" at the end of those are just to make sure the script continues even if a build fails
mv Merged/*.jar buildAllJars/
done
+8 -2
View File
@@ -1,3 +1,10 @@
buildscript {
configurations.configureEach {
resolutionStrategy {
force 'org.spongepowered:vanillagradle:0.2.1-20240507.024226-82'
}
}
}
// temporary fix for broken spongepowered version
buildscript {
@@ -35,5 +42,4 @@ publishing {
repositories {
// Add repositories to publish to here.
}
}
}
@@ -1,18 +1,30 @@
package com.seibel.distanthorizons.common;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.*;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeDhInitEvent;
import com.seibel.distanthorizons.common.wrappers.DependencySetup;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
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.config.types.AbstractConfigType;
import com.seibel.distanthorizons.core.config.types.ConfigEntry;
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.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.network.messages.MessageRegistry;
import com.seibel.distanthorizons.core.network.messages.base.CodecCrashMessage;
import com.seibel.distanthorizons.core.util.objects.Pair;
import com.seibel.distanthorizons.core.world.DhServerWorld;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModAccessor;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
@@ -23,9 +35,25 @@ import net.minecraft.server.dedicated.DedicatedServer;
import org.apache.logging.log4j.Logger;
import java.lang.invoke.MethodHandles;
import java.util.HashMap;
import java.util.Objects;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import static com.mojang.brigadier.arguments.DoubleArgumentType.doubleArg;
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
import static com.seibel.distanthorizons.core.network.messages.MessageRegistry.DEBUG_ENABLE_CODEC_CRASH_MESSAGE;
import static net.minecraft.commands.Commands.argument;
import static net.minecraft.commands.Commands.literal;
#if MC_VER >= MC_1_19_2
import net.minecraft.network.chat.Component;
#else // < 1.19.2
import net.minecraft.network.chat.TranslatableComponent;
#endif
/**
* Base for all mod loader initializers
* and handles most setup.
@@ -67,7 +95,7 @@ public abstract class AbstractModInitializer
ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null);
this.startup();
this.printModInfo(true);
this.printModInfo();
this.createClientProxy().registerEvents();
this.createServerProxy(false).registerEvents();
@@ -91,7 +119,7 @@ public abstract class AbstractModInitializer
ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null);
this.startup();
this.printModInfo(false);
this.printModInfo();
// This prevents returning uninitialized Config values,
// resulting from a circular reference mid-initialization in a static class
@@ -100,6 +128,8 @@ public abstract class AbstractModInitializer
this.createServerProxy(true).registerEvents();
this.initializeModCompat();
LOGGER.info(ModInfo.READABLE_NAME + " Initialized");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null);
@@ -130,17 +160,14 @@ public abstract class AbstractModInitializer
this.createInitialBindings();
}
private void printModInfo(boolean printGitInfo)
private void printModInfo()
{
LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION);
if (printGitInfo)
{
// Useful for dev builds
LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch);
LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit);
LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source);
}
// Useful for dev builds
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)
@@ -166,7 +193,136 @@ public abstract class AbstractModInitializer
LOGGER.info("Mod Post-Initialized");
}
private void initCommands() { /* currently unimplemented */ }
@SuppressWarnings({"rawtypes", "unchecked"})
private void initCommands()
{
LiteralArgumentBuilder<CommandSourceStack> builder = literal("dhconfig")
.requires(source -> source.hasPermission(4));
for (AbstractConfigType<?, ?> type : ConfigBase.INSTANCE.entries)
{
if (!(type instanceof ConfigEntry))
{
continue;
}
//noinspection PatternVariableCanBeUsed
ConfigEntry configEntry = (ConfigEntry) type;
if (configEntry.getServersideShortName() == null)
{
continue;
}
Function<
Function<CommandContext<CommandSourceStack>, Object>,
Command<CommandSourceStack>
> makeConfigUpdater = getter -> c -> {
Object value = getter.apply(c);
c.getSource().sendSuccess(
#if MC_VER >= MC_1_20_1
() -> Component.literal("Changed the value of "+configEntry.getServersideShortName()+" to "+value),
#elif MC_VER >= MC_1_19_2
Component.literal("Changed the value of "+configEntry.getServersideShortName()+" to "+value),
#else
new TranslatableComponent("Changed the value of "+configEntry.getServersideShortName()+" to "+value),
#endif
true);
configEntry.set(value);
return 1;
};
LiteralArgumentBuilder<CommandSourceStack> subcommand = literal(configEntry.getServersideShortName())
.executes(c -> {
#if MC_VER >= MC_1_20_1
c.getSource().sendSuccess(() -> Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
#elif MC_VER >= MC_1_19_2
c.getSource().sendSuccess(Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
#else // < 1.19.2
c.getSource().sendSuccess(new TranslatableComponent("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
#endif
return 1;
});
if (Enum.class.isAssignableFrom(configEntry.getType()))
{
for (Object choice : configEntry.getType().getEnumConstants())
{
subcommand.then(
literal(choice.toString())
.executes(makeConfigUpdater.apply(c -> choice))
);
}
}
else
{
boolean setterAdded = false;
for (java.util.Map.Entry<Class<?>, Pair<Supplier<ArgumentType<?>>, BiFunction<CommandContext<?>, String, ?>>> pair : new HashMap<
Class<?>,
Pair<
Supplier<ArgumentType<?>>,
BiFunction<CommandContext<?>, String, ?>>
>() {{
this.put(Integer.class, new Pair<>(() -> integer((int) configEntry.getMin(), (int) configEntry.getMax()), IntegerArgumentType::getInteger));
this.put(Double.class, new Pair<>(() -> doubleArg((double) configEntry.getMin(), (double) configEntry.getMax()), DoubleArgumentType::getDouble));
this.put(Boolean.class, new Pair<>(BoolArgumentType::bool, BoolArgumentType::getBool));
this.put(String.class, new Pair<>(StringArgumentType::string, StringArgumentType::getString));
}}.entrySet())
{
if (!pair.getKey().isAssignableFrom(configEntry.getType()))
{
continue;
}
subcommand.then(argument("value", pair.getValue().first.get())
.executes(makeConfigUpdater.apply(c -> pair.getValue().second.apply(c, "value"))));
setterAdded = true;
break;
}
if (!setterAdded)
{
throw new RuntimeException("Config type of "+type.getName()+" is not supported: "+configEntry.getType().getSimpleName());
}
}
builder.then(subcommand);
}
this.commandDispatcher.register(builder);
if (DEBUG_ENABLE_CODEC_CRASH_MESSAGE)
{
LiteralArgumentBuilder<CommandSourceStack> dhcrash = literal("dhcrash")
.requires(source -> source.hasPermission(4))
.then(literal("encode")
.executes(c -> {
assert SharedApi.getIDhServerWorld() != null;
((DhServerWorld) SharedApi.getIDhServerWorld()).remotePlayerConnectionHandler
#if MC_VER >= MC_1_19_2
.getConnectedPlayer(ServerPlayerWrapper.getWrapper(Objects.requireNonNull(c.getSource().getPlayer())))
#else
.getConnectedPlayer(ServerPlayerWrapper.getWrapper(Objects.requireNonNull(c.getSource().getPlayerOrException())))
#endif
.session.sendMessage(new CodecCrashMessage(CodecCrashMessage.ECrashPhase.ENCODE));
return 1;
}))
.then(literal("decode")
.executes(c -> {
assert SharedApi.getIDhServerWorld() != null;
((DhServerWorld) SharedApi.getIDhServerWorld()).remotePlayerConnectionHandler
#if MC_VER >= MC_1_19_2
.getConnectedPlayer(ServerPlayerWrapper.getWrapper(Objects.requireNonNull(c.getSource().getPlayer())))
#else
.getConnectedPlayer(ServerPlayerWrapper.getWrapper(Objects.requireNonNull(c.getSource().getPlayerOrException())))
#endif
.session.sendMessage(new CodecCrashMessage(CodecCrashMessage.ECrashPhase.DECODE));
return 1;
}));
this.commandDispatcher.register(dhcrash);
}
}
@@ -179,4 +335,4 @@ public abstract class AbstractModInitializer
void registerEvents();
}
}
}
@@ -0,0 +1,114 @@
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.IncompatibleMessageEvent;
import com.seibel.distanthorizons.core.network.event.internal.ProtocolErrorEvent;
import com.seibel.distanthorizons.core.network.messages.MessageRegistry;
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
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 org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.Objects;
public abstract class AbstractPluginPacketSender implements IPluginPacketSender
{
private static final ConfigBasedLogger LOGGER = new ConfigBasedLogger(LogManager.getLogger(),
() -> Config.Client.Advanced.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 sendPluginPacketServer(IServerPlayerWrapper serverPlayer, NetworkMessage message)
{
this.sendPluginPacketServer((ServerPlayer) serverPlayer.getWrappedMcObject(), message);
}
@Override
public abstract void sendPluginPacketClient(NetworkMessage message);
public abstract void sendPluginPacketServer(ServerPlayer serverPlayer, NetworkMessage message);
@Nullable
public static NetworkMessage decodeMessage(FriendlyByteBuf in)
{
NetworkMessage message = null;
try
{
in.markReaderIndex();
int protocolVersion = in.readShort();
if (protocolVersion != ModInfo.PROTOCOL_VERSION)
{
return new IncompatibleMessageEvent(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 ProtocolErrorEvent(e, message, true);
}
finally
{
// Prevent connection crashing if not entire buffer has been read
in.readerIndex(in.writerIndex());
}
}
public static void encodeMessage(FriendlyByteBuf out, NetworkMessage 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 ProtocolErrorEvent(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,45 @@
package com.seibel.distanthorizons.common;
#if MC_VER >= MC_1_20_6
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
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 NetworkMessage 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,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, level, ServerLevelWrapper.getWrapper(level)),
ServerLevelWrapper.getWrapper(level)
);
}
}
@@ -20,11 +20,9 @@
package com.seibel.distanthorizons.common.wrappers;
import java.nio.FloatBuffer;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import com.seibel.distanthorizons.core.enums.EDhDirection;
import com.seibel.distanthorizons.core.pos.DhBlockPos;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.util.math.Mat4f;
@@ -137,41 +135,10 @@ public class McObjectConverter
}
}
public static BlockPos Convert(DhBlockPos wrappedPos)
{
return new BlockPos(wrappedPos.x, wrappedPos.y, wrappedPos.z);
}
public static ChunkPos Convert(DhChunkPos wrappedPos)
{
return new ChunkPos(wrappedPos.x, wrappedPos.z);
}
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()];
}
public static void DebugCheckAllPackers()
{
BiConsumer<Integer, Integer> func = (x, z) -> DhChunkPos._DebugCheckPacker(x, z, ChunkPos.asLong(x, z));
func.accept(0, 0);
func.accept(12345, 134);
func.accept(-12345, -134);
func.accept(-30000000 / 16, 30000000 / 16);
func.accept(30000000 / 16, -30000000 / 16);
func.accept(30000000 / 16, 30000000 / 16);
func.accept(-30000000 / 16, -30000000 / 16);
Consumer<BlockPos> func2 = (p) -> DhBlockPos._DebugCheckPacker(p.getX(), p.getY(), p.getZ(), p.asLong());
func2.accept(new BlockPos(0, 0, 0));
func2.accept(new BlockPos(12345, 134, 123));
func2.accept(new BlockPos(-12345, -134, -80));
func2.accept(new BlockPos(-30000000, 2047, 30000000));
func2.accept(new BlockPos(30000000, -2048, -30000000));
func2.accept(new BlockPos(30000000, 2047, 30000000));
func2.accept(new BlockPos(-30000000, -2048, -30000000));
}
public static Direction Convert(EDhDirection lodDirection) { return directions[lodDirection.ordinal()]; }
public static EDhDirection Convert(Direction direction) { return lodDirections[direction.ordinal()]; }
}
@@ -155,7 +155,7 @@ public class WrapperFactory implements IWrapperFactory
}
}
#if MC_VER <= MC_1_21
//#if MC_VER <= MC_1_XX_X
else if (objectArray.length == 2)
{
// correct number of parameters from the API
@@ -179,19 +179,9 @@ public class WrapperFactory implements IWrapperFactory
// level wrapper
ILevelWrapper levelWrapper;
if (level instanceof ServerLevel)
{
levelWrapper = ServerLevelWrapper.getWrapper((ServerLevel)level);
}
else if (level instanceof ClientLevel)
{
levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel)level);
}
else
{
throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
}
ILevelWrapper levelWrapper = level.isClientSide()
? ClientLevelWrapper.getWrapper((ClientLevel)level)
: ServerLevelWrapper.getWrapper((ServerLevel)level);
return new ChunkWrapper(chunk, lightSource, levelWrapper);
@@ -201,16 +191,7 @@ public class WrapperFactory implements IWrapperFactory
{
throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
}
#else
// Intentional compiler error to bring attention to the missing wrapper function.
// If you need to work on an unimplemented version but don't have the ability to implement this yet
// you can comment it out, but please don't commit it. Someone will have to implement it.
// After implementing the new version please read this method's javadocs for instructions
// on what other locations also need to be updated, the DhAPI specifically needs to
// be updated to state which objects this method accepts.
not implemented for this version of Minecraft!
#endif
//#endif
}
/**
* Note: when this is updated for different MC versions,
@@ -220,16 +201,13 @@ public class WrapperFactory implements IWrapperFactory
{
String[] expectedClassNames;
#if MC_VER <= MC_1_21
//#if MC_VER <= MC_1_XX_X
expectedClassNames = new String[]
{
ChunkAccess.class.getName(),
ServerLevel.class.getName() + "] or [" + ClientLevel.class.getName()
"[ServerLevel] or [ClientLevel]" // Classes are not referenced by names to avoid exception when one of them is missing
};
#else
// See preprocessor comment in createChunkWrapper() for full documentation
not implemented for this version of Minecraft!
#endif
//#endif
return createWrapperErrorMessage("Chunk wrapper", expectedClassNames, objectArray);
}
@@ -268,7 +246,7 @@ public class WrapperFactory implements IWrapperFactory
Biome biome = (Biome) objectArray[0];
return BiomeWrapper.getBiomeWrapper(biome, coreLevelWrapper);
#elif MC_VER <= MC_1_21
#else
if (!(objectArray[0] instanceof Holder) || !(((Holder<?>) objectArray[0]).value() instanceof Biome))
{
throw new ClassCastException(createBiomeWrapperErrorMessage(objectArray));
@@ -276,9 +254,6 @@ public class WrapperFactory implements IWrapperFactory
Holder<Biome> biomeHolder = (Holder<Biome>) objectArray[0];
return BiomeWrapper.getBiomeWrapper(biomeHolder, coreLevelWrapper);
#else
// See preprocessor comment in createChunkWrapper() for full documentation (not a typo, check createChunkWrapper()'s else statement for full documentation)
not implemented for this version of Minecraft!
#endif
}
/**
@@ -291,11 +266,8 @@ public class WrapperFactory implements IWrapperFactory
#if MC_VER < MC_1_18_2
expectedClassNames = new String[] { Biome.class.getName() };
#elif MC_VER <= MC_1_21
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
#else
// See preprocessor comment in createChunkWrapper() for full documentation
not implemented for this version of Minecraft!
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
#endif
return createWrapperErrorMessage("Biome wrapper", expectedClassNames, objectArray);
@@ -312,7 +284,7 @@ public class WrapperFactory implements IWrapperFactory
#if MC_VER <= MC_1_21
//#if MC_VER <= MC_1_XX_X
if (objectArray.length != 1)
{
throw new ClassCastException(createBlockStateWrapperErrorMessage(objectArray));
@@ -324,10 +296,7 @@ public class WrapperFactory implements IWrapperFactory
BlockState blockState = (BlockState) objectArray[0];
return BlockStateWrapper.fromBlockState(blockState, coreLevelWrapper);
#else
// See preprocessor comment in createChunkWrapper() for full documentation (not a typo, check createChunkWrapper()'s else statement for full documentation)
not implemented for this version of Minecraft!
#endif
//#endif
}
/**
* Note: when this is updated for different MC versions,
@@ -339,11 +308,8 @@ public class WrapperFactory implements IWrapperFactory
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
expectedClassNames = new String[] { Biome.class.getName() };
#elif MC_VER <= MC_1_21
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
#else
// See preprocessor comment in createChunkWrapper() for full documentation
not implemented for this version of Minecraft!
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
#endif
return createWrapperErrorMessage("BlockState wrapper", expectedClassNames, objectArray);
@@ -293,7 +293,7 @@ public class BiomeWrapper implements IBiomeWrapper
ResourceLocation resourceLocation;
try
{
#if MC_VER < MC_1_21
#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));
@@ -30,6 +30,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrappe
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;
@@ -53,7 +54,6 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry;
import net.minecraft.world.level.EmptyBlockGetter;
#else
import net.minecraft.client.Minecraft;
import net.minecraft.world.level.Level;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.Registries;
@@ -102,8 +102,9 @@ public class BlockStateWrapper implements IBlockStateWrapper
private byte blockMaterialId = 0;
private final boolean isBeaconBlock;
private final boolean isBeaconBaseBlock;
private final boolean isGlassBlock;
private final boolean isBeaconBaseBlock;
/** null if this block can't tint beacons */
private final Color beaconTintColor;
private final Color mapColor;
@@ -139,6 +140,7 @@ public class BlockStateWrapper implements IBlockStateWrapper
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++)
@@ -152,7 +154,28 @@ public class BlockStateWrapper implements IBlockStateWrapper
}
this.isBeaconBaseBlock = isBeaconBaseBlock;
this.isBeaconBlock = lowercaseSerial.contains("minecraft:beacon");
this.isGlassBlock = lowercaseSerial.contains("glass");
// 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)
@@ -399,10 +422,12 @@ public class BlockStateWrapper implements IBlockStateWrapper
@Override
public boolean isBeaconBaseBlock() { return this.isBeaconBaseBlock; }
@Override
public boolean isGlassBlock() { return this.isGlassBlock; }
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; }
@@ -498,7 +523,7 @@ public class BlockStateWrapper implements IBlockStateWrapper
ResourceLocation resourceLocation;
try
{
#if MC_VER < MC_1_21
#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));
@@ -516,9 +541,7 @@ public class BlockStateWrapper implements IBlockStateWrapper
{
#if MC_VER > MC_1_17_1
// use the given level if possible, otherwise try using the currently loaded one
Level level = (levelWrapper != null ? (Level) levelWrapper.getWrappedMcObject() : null);
level = (level == null ? Minecraft.getInstance().level : level);
Level level = (Level)Objects.requireNonNull(levelWrapper.getWrappedMcObject());
#endif
Block block;
@@ -733,4 +756,4 @@ public class BlockStateWrapper implements IBlockStateWrapper
}
}
}
}
@@ -19,13 +19,9 @@
package com.seibel.distanthorizons.common.wrappers.block;
import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
import com.seibel.distanthorizons.common.wrappers.block.TextureAtlasSpriteWrapper;
import com.seibel.distanthorizons.common.wrappers.block.TintWithoutLevelOverrider;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.block.*;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.pos.DhBlockPos;
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;
@@ -22,9 +22,12 @@ 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.worldGeneration.mimicObject.DhLitWorldGenRegion;
import com.seibel.distanthorizons.core.api.internal.SharedApi;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.pos.DhBlockPos;
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.world.EWorldEnvironment;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
@@ -140,7 +143,8 @@ public class ChunkWrapper implements IChunkWrapper
// FIXME +1 is to handle the fact that LodDataBuilder adds +1 to all block lighting calculations, also done in the relative position validator
chunksNeedingClientLightUpdating.add(this);
if (SharedApi.getEnvironment() != EWorldEnvironment.Server_Only)
chunksNeedingClientLightUpdating.add(this);
}
@@ -305,7 +309,7 @@ public class ChunkWrapper implements IChunkWrapper
public ChunkStatus getStatus() { return getStatus(this.getChunk()); }
public static ChunkStatus getStatus(ChunkAccess chunk)
{
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
return chunk.getStatus();
#else
return chunk.getPersistedStatus();
@@ -348,7 +352,7 @@ public class ChunkWrapper implements IChunkWrapper
if (this.chunk instanceof LevelChunk)
{
LevelChunk levelChunk = (LevelChunk) this.chunk;
if (levelChunk.getLevel() instanceof ClientLevel)
if (levelChunk.getLevel().isClientSide())
{
// connected to a server
return this.isMcClientLightingCorrect;
@@ -390,6 +394,8 @@ public class ChunkWrapper implements IChunkWrapper
return this.blockLightStorage;
}
public void setBlockLightStorage(ChunkLightStorage lightStorage) { this.blockLightStorage = lightStorage; }
@Override
public void clearDhBlockLighting() { this.getBlockLightStorage().clear(); }
@Override
@@ -404,6 +410,8 @@ public class ChunkWrapper implements IChunkWrapper
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
this.getSkyLightStorage().set(relX, y, relZ, lightValue);
}
@Override
public void clearDhSkyLighting() { this.getSkyLightStorage().clear(); }
private ChunkLightStorage getSkyLightStorage()
{
@@ -459,7 +467,7 @@ public class ChunkWrapper implements IChunkWrapper
* before the list has finished populating.
*/
@Override
public synchronized ArrayList<DhBlockPos> getBlockLightPosList()
public synchronized ArrayList<DhBlockPos> getWorldBlockLightPosList()
{
// only populate the list once
if (this.blockLightPosList == null)
@@ -475,7 +483,13 @@ public class ChunkWrapper implements IChunkWrapper
#else
this.chunk.findBlockLightSources((blockPos, blockState) ->
{
this.blockLightPosList.add(new DhBlockPos(blockPos.getX(), blockPos.getY(), blockPos.getZ()));
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
}
@@ -595,4 +609,4 @@ public class ChunkWrapper implements IChunkWrapper
// return this.blockBiomeHashCode;
//}
}
}
@@ -259,7 +259,7 @@ public class ClassicConfigGUI
0, 0,
// Some textuary stuff
0,
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"),
#else
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/changelog.png"),
@@ -76,7 +76,7 @@ public class UpdateModScreen extends DhScreen
0, 0,
// Some textuary stuff
0,
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
new ResourceLocation(ModInfo.ID, "logo.png"),
#else
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "logo.png"),
@@ -107,7 +107,7 @@ public class UpdateModScreen extends DhScreen
0, 0,
// Some textuary stuff
0,
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"),
#else
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/changelog.png"),
@@ -1,21 +1,20 @@
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.level.IKeyedClientLevelManager;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import net.minecraft.client.multiplayer.ClientLevel;
import java.util.Objects;
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. */
private IServerKeyedClientLevel overrideWrapper = null;
private boolean useOverrideWrapper = false;
@Nullable
private IServerKeyedClientLevel serverKeyedLevel = null;
private boolean enabled = false;
//=============//
@@ -30,25 +29,39 @@ public class KeyedClientLevelManager implements IKeyedClientLevelManager
// level override logic //
//======================//
@Override
public void setServerKeyedLevel(IServerKeyedClientLevel clientLevel) { this.overrideWrapper = clientLevel; }
@Override
public IServerKeyedClientLevel getOverrideWrapper() { return this.overrideWrapper; }
@Override
public IServerKeyedClientLevel getServerKeyedLevel(ILevelWrapper level, String serverLevelKey)
@Nullable
public IServerKeyedClientLevel getServerKeyedLevel()
{
Objects.requireNonNull(level);
Objects.requireNonNull(serverLevelKey);
return new ServerKeyedClientLevel((ClientLevel) level.getWrappedMcObject(), serverLevelKey);
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 setUseOverrideWrapper(boolean useOverrideWrapper) { this.useOverrideWrapper = useOverrideWrapper; }
public void clearServerKeyedLevel()
{
this.serverKeyedLevel = null;
}
@Override
public boolean getUseOverrideWrapper() { return this.useOverrideWrapper; }
public boolean isEnabled()
{
return this.enabled;
}
@Override
public void disable()
{
this.enabled = false;
}
}
@@ -18,4 +18,11 @@ public class ServerKeyedClientLevel extends ClientLevelWrapper implements IServe
@Override
public String getServerLevelKey() { return this.serverLevelKey; }
}
@Override
public String getDimensionName()
{
return this.getServerLevelKey();
}
}
@@ -39,14 +39,14 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftCli
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.DhBlockPos;
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.client.resources.model.ModelManager;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
#if MC_VER < MC_1_19_2
@@ -54,6 +54,7 @@ import net.minecraft.network.chat.TextComponent;
#endif
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.ChunkPos;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;
@@ -223,12 +224,20 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public IClientLevelWrapper getWrappedClientLevel()
{
if (MINECRAFT.level == null)
return this.getWrappedClientLevel(false);
}
@Override
@Nullable
public IClientLevelWrapper getWrappedClientLevel(boolean bypassMultiverse)
{
ClientLevel level = MINECRAFT.level;
if (level == null)
{
return null;
}
return ClientLevelWrapper.getWrapperIgnoringOverride(MINECRAFT.level);
return ClientLevelWrapper.getWrapper(level, bypassMultiverse);
}
@Override
@@ -267,7 +276,10 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
public void sendChatMessage(String string)
{
LocalPlayer player = this.getPlayer();
if (player == null) return;
if (player == null)
{
return;
}
#if MC_VER < MC_1_19_2
player.sendMessage(new TextComponent(string), getPlayer().getUUID());
#else
@@ -307,4 +319,10 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public void executeOnRenderThread(Runnable runnable) { MINECRAFT.execute(runnable); }
@Override
public boolean isWorldInitialized()
{
throw new NotImplementedException("TODO");
}
}
@@ -21,11 +21,17 @@ public class MinecraftDedicatedServerWrapper implements IMinecraftSharedWrapper
throw new IllegalStateException("Trying to get Installation Direction before Dedicated server complete initialization!");
}
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
return this.dedicatedServer.getServerDirectory();
#else
return this.dedicatedServer.getServerDirectory().toFile();
#endif
}
}
@Override
public boolean isWorldInitialized()
{
return this.dedicatedServer.getWorldData().overworldData().isInitialized();
}
}
@@ -21,29 +21,26 @@ package com.seibel.distanthorizons.common.wrappers.minecraft;
import java.awt.Color;
import java.lang.invoke.MethodHandles;
import java.util.Collection;
import java.util.HashSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.NativeImage;
import com.mojang.blaze3d.systems.RenderSystem;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.WrapperFactory;
import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
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
import org.joml.Matrix4f;
import org.joml.Vector3f;
#endif
#if MC_VER >= MC_1_20_2
import net.minecraft.client.renderer.chunk.SectionRenderDispatcher;
@@ -53,20 +50,14 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOpt
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.Mat4f;
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 com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor;
import com.seibel.distanthorizons.core.pos.DhBlockPos;
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.core.BlockPos;
import net.minecraft.world.effect.MobEffects;
#if MC_VER < MC_1_17_1
import net.minecraft.tags.FluidTags;
@@ -76,7 +67,6 @@ import org.lwjgl.opengl.GL15;
#else
import net.minecraft.world.level.material.FogType;
#endif
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.apache.logging.log4j.Logger;
@@ -165,7 +155,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
if (MC.level.dimensionType().hasSkyLight())
{
float frameTime;
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
frameTime = MC.getFrameTime();
#else
frameTime = MC.getTimer().getRealtimeDeltaTicks();
@@ -0,0 +1,11 @@
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();
}
@@ -1,54 +1,120 @@
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.util.UUID;
import java.net.SocketAddress;
import java.util.concurrent.ConcurrentMap;
/**
* This wrapper transparently ensures that underlying {@link ServerPlayer} is always valid,
* unless the player has disconnected.
*/
public class ServerPlayerWrapper implements IServerPlayerWrapper
{
private static final ConcurrentMap<ServerPlayer, ServerPlayerWrapper>
serverPlayerWrapperMap = new MapMaker().weakKeys().makeMap();
private static final ConcurrentMap<ServerGamePacketListenerImpl, ServerPlayerWrapper> serverPlayerWrapperMap = new MapMaker().weakKeys().weakValues().makeMap();
private final ServerPlayer serverPlayer;
private final ServerGamePacketListenerImpl connection;
private ServerPlayer serverPlayer()
{
return this.connection.player;
}
public static ServerPlayerWrapper getWrapper(ServerPlayer serverPlayer)
{
return serverPlayerWrapperMap.computeIfAbsent(serverPlayer, ServerPlayerWrapper::new);
return serverPlayerWrapperMap.computeIfAbsent(serverPlayer.connection, ignored -> new ServerPlayerWrapper(serverPlayer.connection));
}
private ServerPlayerWrapper(ServerPlayer serverPlayer)
private ServerPlayerWrapper(ServerGamePacketListenerImpl connection)
{
this.serverPlayer = serverPlayer;
this.connection = connection;
}
public UUID getUUID()
@Override
public String getName()
{
return serverPlayer.getUUID();
return this.serverPlayer().getName().getString();
}
@Override
public IServerLevelWrapper getLevel()
{
#if MC_VER < MC_1_20_1
return ServerLevelWrapper.getWrapper(this.serverPlayer.getLevel());
#else
return ServerLevelWrapper.getWrapper(this.serverPlayer.serverLevel());
ServerLevel level = ((IMixinServerPlayer) this.serverPlayer()).distantHorizons$getDimensionChangeDestination();
if (level == null)
{
#if MC_VER < MC_1_20_1
level = this.serverPlayer().getLevel();
#else
level = this.serverPlayer().serverLevel();
#endif
}
return ServerLevelWrapper.getWrapper(level);
}
@Override
public Vec3d getPosition()
{
Vec3 position = this.serverPlayer().position();
return new Vec3d(position.x, position.y, position.z);
}
@Override
public int getViewDistance()
{
return this.serverPlayer().server.getPlayerList().getViewDistance();
}
@Override
public SocketAddress getRemoteAddress()
{
#if MC_VER >= MC_1_19_4
return this.serverPlayer().connection.getRemoteAddress();
#else // < 1.19.4
return this.serverPlayer().connection.connection.getRemoteAddress();
#endif
}
@Override
public Object getWrappedMcObject()
{
return serverPlayer;
return this.serverPlayer();
}
@Override
public String toString()
{
return "Wrapped{" + serverPlayer.toString() + "}";
return "Wrapped{" + this.serverPlayer() + "}";
}
}
@Override
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if (!(o instanceof ServerPlayerWrapper))
{
return false;
}
ServerPlayerWrapper that = (ServerPlayerWrapper) o;
return Objects.equal(this.connection, that.connection);
}
@Override
public int hashCode()
{
return Objects.hashCode(this.connection);
}
}
@@ -7,13 +7,12 @@ 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.api.internal.ClientApi;
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.DhBlockPos;
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.util.ColorUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
@@ -26,10 +25,12 @@ 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.IOException;
import java.util.concurrent.ConcurrentHashMap;
@@ -69,23 +70,31 @@ public class ClientLevelWrapper implements IClientLevelWrapper
// wrapper logic //
//===============//
@Nullable
public static IClientLevelWrapper getWrapper(@Nullable ClientLevel level)
public static IClientLevelWrapper getWrapper(@NotNull ClientLevel level)
{
if (level == null)
{
return null;
}
// used if the client is connected to a server that defines the currently loaded level
if (KEYED_CLIENT_LEVEL_MANAGER.getUseOverrideWrapper())
{
return KEYED_CLIENT_LEVEL_MANAGER.getOverrideWrapper();
}
return getWrapperIgnoringOverride(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);
}
public static IClientLevelWrapper getWrapperIgnoringOverride(@NotNull ClientLevel level) { return LEVEL_WRAPPER_BY_CLIENT_LEVEL.computeIfAbsent(level, ClientLevelWrapper::new); }
@Nullable
@Override
@@ -118,8 +127,6 @@ public class ClientLevelWrapper implements IClientLevelWrapper
}
}
//====================//
// base level methods //
//====================//
@@ -179,6 +186,13 @@ public class ClientLevelWrapper implements IClientLevelWrapper
@Override
public IDimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }
@Override
public String getDimensionName()
{
return this.level.dimension().location().toString();
}
@Override
public EDhApiLevelType getLevelType() { return EDhApiLevelType.CLIENT_LEVEL; }
@@ -207,12 +221,12 @@ public class ClientLevelWrapper implements IClientLevelWrapper
@Override
public IChunkWrapper tryGetChunk(DhChunkPos pos)
{
if (!this.level.hasChunk(pos.x, pos.z))
if (!this.level.hasChunk(pos.getX(), pos.getZ()))
{
return null;
}
ChunkAccess chunk = this.level.getChunk(pos.x, pos.z, ChunkStatus.EMPTY, false);
ChunkAccess chunk = this.level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.EMPTY, false);
if (chunk == null)
{
return null;
@@ -267,6 +281,13 @@ public class ClientLevelWrapper implements IClientLevelWrapper
return this.parentDhLevel.getGenericRenderer();
}
@Override
public Color getCloudColor(float tickDelta)
{
Vec3 colorVec3 = this.level.getCloudColor(tickDelta);
return new Color((float)colorVec3.x, (float)colorVec3.y, (float)colorVec3.z);
}
//================//
@@ -281,7 +302,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper
return "Wrapped{null}";
}
return "Wrapped{" + this.level.toString() + "@" + this.getDimensionType().getDimensionName() + "}";
return "Wrapped{" + this.level.toString() + "@" + this.getDimensionName() + "}";
}
}
}
@@ -44,7 +44,9 @@ public class DimensionTypeWrapper implements IDimensionTypeWrapper
{
//first we check if the biome has already been wrapped
if (dimensionTypeWrapperMap.containsKey(dimensionType) && dimensionTypeWrapperMap.get(dimensionType) != null)
{
return dimensionTypeWrapperMap.get(dimensionType);
}
//if it hasn't been created yet, we create it and save it in the map
@@ -61,22 +63,26 @@ public class DimensionTypeWrapper implements IDimensionTypeWrapper
}
@Override
public String getDimensionName()
private String getDimensionName()
{
return dimensionType.effectsLocation().getPath();
#if MC_VER >= MC_1_17_1
return this.dimensionType.effectsLocation().getPath();
#else // < 1.17.1
// effectsLocation() is marked as client only, so using the backing field directly
return dimensionType.effectsLocation.getPath();
#endif
}
@Override
public boolean hasCeiling()
{
return dimensionType.hasCeiling();
return this.dimensionType.hasCeiling();
}
@Override
public boolean hasSkyLight()
{
return dimensionType.hasSkyLight();
return this.dimensionType.hasSkyLight();
}
@Override
@@ -85,7 +91,15 @@ public class DimensionTypeWrapper implements IDimensionTypeWrapper
return this.dimensionType;
}
@Override
public double getTeleportationScale(IDimensionTypeWrapper to)
{
return DimensionType.getTeleportationScale(this.dimensionType, (DimensionType) to.getWrappedMcObject());
}
// there's definitely a better way of doing this, but it should work well enough for now
@Override
public boolean isTheEnd() { return this.getDimensionName().equalsIgnoreCase("the_end"); }
@Override
public boolean equals(Object obj)
@@ -102,4 +116,4 @@ public class DimensionTypeWrapper implements IDimensionTypeWrapper
}
}
}
@@ -30,7 +30,7 @@ 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.DhBlockPos;
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;
@@ -48,7 +48,6 @@ import net.minecraft.world.level.chunk.status.ChunkStatus;
#endif
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;
/**
* @version 2022-9-16
@@ -84,13 +83,19 @@ public class ServerLevelWrapper implements IServerLevelWrapper
@Override
public File getSaveFolder()
{
return level.getChunkSource().getDataStorage().dataFolder;
return this.level.getChunkSource().getDataStorage().dataFolder;
}
@Override
public DimensionTypeWrapper getDimensionType()
{
return DimensionTypeWrapper.getDimensionTypeWrapper(level.dimensionType());
return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType());
}
@Override
public String getDimensionName()
{
return this.level.dimension().location().toString();
}
@Override
@@ -98,25 +103,25 @@ public class ServerLevelWrapper implements IServerLevelWrapper
public ServerLevel getLevel()
{
return level;
return this.level;
}
@Override
public boolean hasCeiling()
{
return level.dimensionType().hasCeiling();
return this.level.dimensionType().hasCeiling();
}
@Override
public boolean hasSkyLight()
{
return level.dimensionType().hasSkyLight();
return this.level.dimensionType().hasSkyLight();
}
@Override
public int getMaxHeight()
{
return level.getHeight();
return this.level.getHeight();
}
@Override
@@ -125,37 +130,43 @@ public class ServerLevelWrapper implements IServerLevelWrapper
#if MC_VER < MC_1_17_1
return 0;
#else
return level.getMinBuildHeight();
return this.level.getMinBuildHeight();
#endif
}
@Override
public IChunkWrapper tryGetChunk(DhChunkPos pos)
{
if (!level.hasChunk(pos.x, pos.z)) return null;
ChunkAccess chunk = level.getChunk(pos.x, pos.z, ChunkStatus.FULL, false);
if (chunk == null) return null;
return new ChunkWrapper(chunk, level, this);
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.level, 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 = level.getChunkSource();
ChunkSource source = this.level.getChunkSource();
return source.hasChunk(chunkX, chunkZ);
}
@Override
public IBlockStateWrapper getBlockState(DhBlockPos pos)
{
return BlockStateWrapper.fromBlockState(level.getBlockState(McObjectConverter.Convert(pos)), this);
return BlockStateWrapper.fromBlockState(this.level.getBlockState(McObjectConverter.Convert(pos)), this);
}
@Override
public IBiomeWrapper getBiome(DhBlockPos pos)
{
return BiomeWrapper.getBiomeWrapper(level.getBiome(McObjectConverter.Convert(pos)), this);
return BiomeWrapper.getBiomeWrapper(this.level.getBiome(McObjectConverter.Convert(pos)), this);
}
@Override
@@ -186,6 +197,6 @@ public class ServerLevelWrapper implements IServerLevelWrapper
//================//
@Override
public String toString() { return "Wrapped{" + this.level.toString() + "@" + this.getDimensionType().getDimensionName() + "}"; }
public String toString() { return "Wrapped{" + this.level.toString() + "@" + this.getDimensionName() + "}"; }
}
}
@@ -398,8 +398,8 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
int borderSize = MAX_WORLD_GEN_CHUNK_BORDER_NEEDED;
// genEvent.size - 1 converts the even width size to an odd number for MC compatability
int refSize = (genEvent.size - 1) + (borderSize * 2);
int refPosX = genEvent.minPos.x - borderSize;
int refPosZ = genEvent.minPos.z - borderSize;
int refPosX = genEvent.minPos.getX() - borderSize;
int refPosZ = genEvent.minPos.getZ() - borderSize;
LightGetterAdaptor lightGetterAdaptor = new LightGetterAdaptor(this.params.level);
DummyLightEngine dummyLightEngine = new DummyLightEngine(lightGetterAdaptor);
@@ -85,7 +85,7 @@ import net.minecraft.world.level.material.Fluids;
#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
#elif MC_VER >= MC_1_21_1
import net.minecraft.world.level.chunk.status.ChunkStatus;
import net.minecraft.world.level.chunk.status.ChunkType;
#endif
@@ -128,7 +128,7 @@ public class ChunkLoader
ChunkPos actualPos = new ChunkPos(tagLevel.getInt("xPos"), tagLevel.getInt("zPos"));
if (!Objects.equals(chunkPos, actualPos))
{
#if MC_VER > MC_1_17_1
#if MC_VER >= MC_1_18_2
if (actualPos.equals(ChunkPos.ZERO))
#else
if (actualPos.equals(ChunkPos.INVALID_CHUNK_POS))
@@ -325,7 +325,7 @@ public class ChunkLoader
}
private static
#if MC_VER < MC_1_20_6 ChunkStatus.ChunkType
#elif MC_VER < MC_1_21 ChunkType
#elif MC_VER < MC_1_21_1 ChunkType
#else ChunkType #endif
readChunkType(CompoundTag tagLevel)
{
@@ -1,6 +1,6 @@
package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject;
#if MC_VER >= MC_1_21
#if MC_VER >= MC_1_21_1
import net.minecraft.server.level.GenerationChunkHolder;
import net.minecraft.world.level.ChunkPos;
@@ -20,7 +20,6 @@
package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject;
import java.lang.invoke.MethodHandles;
import java.util.EnumSet;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
@@ -63,7 +62,7 @@ import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.world.level.chunk.status.*;
#endif
#if MC_VER == MC_1_21
#if MC_VER >= MC_1_21_1
import net.minecraft.util.StaticCache2D;
import com.google.common.collect.ImmutableList;
import net.minecraft.server.level.GenerationChunkHolder;
@@ -127,7 +126,7 @@ public class DhLitWorldGenRegion extends WorldGenRegion
{
#if MC_VER == MC_1_16_5
super(serverLevel, chunkList);
#elif MC_VER < MC_1_21
#elif MC_VER < MC_1_21_1
super(serverLevel, chunkList, chunkStatus, writeRadius);
#else
super(serverLevel,
@@ -235,6 +234,22 @@ public class DhLitWorldGenRegion extends WorldGenRegion
#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; }
@@ -68,7 +68,7 @@ public final class StepBiomes
}
else if (chunk instanceof ProtoChunk)
{
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
((ProtoChunk) chunk).setStatus(STATUS);
#else
((ProtoChunk) chunk).setPersistedStatus(STATUS);
@@ -89,7 +89,7 @@ public final class StepBiomes
#elif MC_VER < MC_1_19_4
chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(this.environment.params.biomes, Runnable::run, this.environment.params.randomState, Blender.of(worldGenRegion),
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
#elif MC_VER < MC_1_21
#elif MC_VER < MC_1_21_1
chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(Runnable::run, this.environment.params.randomState, Blender.of(worldGenRegion),
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
#else
@@ -66,7 +66,7 @@ public final class StepFeatures
}
else if (chunk instanceof ProtoChunk)
{
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
((ProtoChunk) chunk).setStatus(STATUS);
#else
((ProtoChunk) chunk).setPersistedStatus(STATUS);
@@ -80,7 +80,7 @@ public final class StepFeatures
worldGenRegion.setOverrideCenter(chunk.getPos());
environment.params.generator.applyBiomeDecoration(worldGenRegion, tParams.structFeat);
#else
if (worldGenRegion.hasChunk(chunkWrapper.getChunkPos().x, chunkWrapper.getChunkPos().z))
if (worldGenRegion.hasChunk(chunkWrapper.getChunkPos().getX(), chunkWrapper.getChunkPos().getZ()))
{
this.environment.params.generator.applyBiomeDecoration(worldGenRegion, chunk, tParams.structFeat.forWorldGenRegion(worldGenRegion));
}
@@ -68,7 +68,7 @@ public final class StepNoise
continue;
}
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
((ProtoChunk) chunk).setStatus(STATUS);
#else
((ProtoChunk) chunk).setPersistedStatus(STATUS);
@@ -87,7 +87,7 @@ public final class StepNoise
#elif MC_VER < MC_1_19_2
chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion),
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
#elif MC_VER < MC_1_21
#elif MC_VER < MC_1_21_1
chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion), this.environment.params.randomState,
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
#else
@@ -66,7 +66,7 @@ public final class StepStructureReference
}
else if (chunk instanceof ProtoChunk)
{
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
((ProtoChunk) chunk).setStatus(STATUS);
#else
((ProtoChunk) chunk).setPersistedStatus(STATUS);
@@ -83,7 +83,7 @@ public final class StepStructureStart
}
else if (chunk instanceof ProtoChunk)
{
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
((ProtoChunk) chunk).setStatus(STATUS);
#else
((ProtoChunk) chunk).setPersistedStatus(STATUS);
@@ -65,7 +65,7 @@ public final class StepSurface
}
else if (chunk instanceof ProtoChunk)
{
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
((ProtoChunk) chunk).setStatus(STATUS);
#else
((ProtoChunk) chunk).setPersistedStatus(STATUS);
@@ -47,4 +47,7 @@ accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite frames
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite framesY [I
accessible field net/minecraft/client/renderer/texture/TextureAtlasSprite mainImage [Lcom/mojang/blaze3d/platform/NativeImage;
# DimensionTypeWrapper workaround
accessible field net/minecraft/world/level/dimension/DimensionType effectsLocation Lnet/minecraft/resources/ResourceLocation;
extendable class com/mojang/math/Matrix4f
+14 -3
View File
@@ -5,19 +5,25 @@ plugins {
loom {
accessWidenerPath = project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
// Custom logging
log4jConfigs.from(file("log4j-dev.xml"))
// "runs" isn't required, but when we do need it then it can be useful
runs {
client {
client()
setConfigName("Fabric Client")
ideConfigGenerated(true)
runDir("../run")
runDir("../run/client")
vmArgs("-Dio.netty.leakDetection.level=advanced")
programArgs("--username", "Dev")
}
server {
server()
setConfigName("Fabric Server")
ideConfigGenerated(true)
runDir("../run")
runDir("../run/server")
vmArgs("-Dio.netty.leakDetection.level=advanced")
}
}
}
@@ -69,6 +75,11 @@ dependencies {
addModJar(fabricApi.module("fabric-events-interaction-v0", rootProject.fabric_api_version))
addModJar(fabricApi.module("fabric-rendering-v1", rootProject.fabric_api_version)) // TODO: Remove this as it is only needed in 1 line (FabricClientProxy)
addModJar(fabricApi.module("fabric-networking-api-v1", rootProject.fabric_api_version))
addModJar(fabricApi.module("fabric-entity-events-v1", rootProject.fabric_api_version))
if (minecraft_version >= "1.19.2")
addModJar(fabricApi.module("fabric-command-api-v2", rootProject.fabric_api_version))
else // < 1.19.2
addModJar(fabricApi.module("fabric-command-api-v1", rootProject.fabric_api_version))
// used by mod menu in MC 1.20.6+
addModJar(fabricApi.module("fabric-screen-api-v1", rootProject.fabric_api_version))
@@ -149,4 +160,4 @@ sourcesJar {
def commonSources = project(":common").sourcesJar
dependsOn commonSources
from commonSources.archiveFile.map { zipTree(it) }
}
}
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="Dev" monitorInterval="10">
<Loggers>
<Logger name="com.seibel.distanthorizons.core.network" level="trace" additivity="false">
<AppenderRef ref="DebugFile" level="${sys:fabric.log.debug.level:-debug}" />
<AppenderRef ref="SysOut" />
<AppenderRef ref="LatestFile" level="${sys:fabric.log.level:-info}" />
<AppenderRef ref="ServerGuiConsole" />
</Logger>
</Loggers>
</Configuration>
@@ -19,9 +19,8 @@
package com.seibel.distanthorizons.fabric;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import com.seibel.distanthorizons.common.AbstractModInitializer;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
@@ -38,17 +37,24 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAcce
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.util.math.Mat4f;
import com.seibel.distanthorizons.fabric.wrappers.modAccessor.SodiumAccessor;
//import io.netty.buffer.ByteBuf;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
import net.fabricmc.fabric.api.event.player.AttackBlockCallback;
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.TitleScreen;
#if MC_VER >= MC_1_20_6
import com.seibel.distanthorizons.common.CommonPacketPayload;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
#else
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
#endif
#if MC_VER < MC_1_19_4
import java.nio.FloatBuffer;
#endif
@@ -60,7 +66,6 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.phys.HitResult;
import org.apache.logging.log4j.Logger;
import org.joml.Matrix4f;
import org.lwjgl.glfw.GLFW;
/**
@@ -89,6 +94,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
* Registers Fabric Events
* @author Ran
*/
@Override
public void registerEvents()
{
LOGGER.info("Registering Fabric Client Events");
@@ -117,8 +123,11 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
// ClientChunkLoadEvent
ClientChunkEvents.CHUNK_LOAD.register((level, chunk) ->
{
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level);
SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
if (MC.clientConnectedToDedicatedServer())
{
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level);
SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
}
});
// (kinda) block break event
@@ -200,14 +209,6 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
});
// Client Chunk Save
ClientChunkEvents.CHUNK_UNLOAD.register((level, chunk) ->
{
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level);
SharedApi.INSTANCE.chunkUnloadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
});
//==============//
// render event //
@@ -227,14 +228,14 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()),
modelViewMatrix,
projectionMatrix,
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
renderContext.tickDelta()
#else
renderContext.tickCounter().getGameTimeDeltaTicks()
#endif
);
});
// Debug keyboard event
// FIXME: Use better hooks so it doesn't trigger key press events in text boxes
ClientTickEvents.END_CLIENT_TICK.register(client ->
@@ -251,17 +252,29 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
// networking event //
//==================//
// ClientPlayNetworking.registerGlobalReceiver(new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE),
// (Minecraft client, ClientPacketListener handler, FriendlyByteBuf friendlyByteBuf, PacketSender responseSender) ->
// {
// // converting to a ByteBuf is necessary otherwise Fabric will complain when the game boots
// ByteBuf nettyByteBuf = friendlyByteBuf.asByteBuf();
//
// // remove the Bukkit/Forge packet ID byte
// nettyByteBuf.readByte();
//
// ClientApi.INSTANCE.serverMessageReceived(nettyByteBuf);
// });
#if MC_VER >= MC_1_20_6
PayloadTypeRegistry.playC2S().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec());
PayloadTypeRegistry.playS2C().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec());
ClientPlayNetworking.registerGlobalReceiver(CommonPacketPayload.TYPE, (payload, context) ->
{
if (payload.message() == null)
{
return;
}
ClientApi.INSTANCE.pluginMessageReceived(payload.message());
});
#else
ClientPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE, (client, handler, buffer, packetSender) ->
{
// Forge packet ID
buffer.readByte();
NetworkMessage message = AbstractPluginPacketSender.decodeMessage(buffer);
if (message != null)
{
ClientApi.INSTANCE.pluginMessageReceived(message);
}
});
#endif
}
public void onKeyInput()
@@ -290,14 +303,14 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
// Diff and trigger events
for (int keyCode : currentKeyDown)
{
if (!previouslyPressKeyCodes.contains(keyCode))
if (!this.previouslyPressKeyCodes.contains(keyCode))
{
ClientApi.INSTANCE.keyPressedEvent(keyCode);
}
}
// Update the set
previouslyPressKeyCodes = currentKeyDown;
this.previouslyPressKeyCodes = currentKeyDown;
}
}
}
@@ -27,6 +27,7 @@ import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.*;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.fabric.wrappers.modAccessor.*;
@@ -40,6 +41,12 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import org.apache.logging.log4j.Logger;
#if MC_VER >= MC_1_19_2
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
#else // < 1.19.2
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
#endif
import javax.swing.*;
import java.awt.*;
import java.util.function.Consumer;
@@ -51,14 +58,22 @@ import java.util.function.Consumer;
*/
public class FabricMain extends AbstractModInitializer implements ClientModInitializer, DedicatedServerModInitializer
{
private static final ResourceLocation INITIAL_PHASE = ResourceLocation.tryParse("distanthorizons:dedicated_server_initial");
#if MC_VER >= MC_1_21_1
private static final ResourceLocation INITIAL_PHASE = ResourceLocation.fromNamespaceAndPath(ModInfo.RESOURCE_NAMESPACE, ModInfo.DEDICATED_SERVER_INITIAL_PATH);
#else
private static final ResourceLocation INITIAL_PHASE = new ResourceLocation(ModInfo.RESOURCE_NAMESPACE, ModInfo.DEDICATED_SERVER_INITIAL_PATH);
#endif
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
@Override
protected void createInitialBindings() { SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE); }
protected void createInitialBindings()
{
SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE);
SingletonInjector.INSTANCE.bind(IPluginPacketSender.class, new FabricPluginPacketSender());
}
@Override
protected IEventProxy createClientProxy() { return new FabricClientProxy(); }
@@ -102,7 +117,12 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti
}
@Override
protected void subscribeRegisterCommandsEvent(Consumer<CommandDispatcher<CommandSourceStack>> eventHandler) { }
protected void subscribeRegisterCommandsEvent(Consumer<CommandDispatcher<CommandSourceStack>> eventHandler)
{
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess #if MC_VER >= MC_1_19_2 , environment #endif ) -> {
eventHandler.accept(dispatcher);
});
}
@Override
protected void subscribeClientStartedEvent(Runnable eventHandler) { ClientLifecycleEvents.CLIENT_STARTED.register((mc) -> eventHandler.run()); }
@@ -120,15 +140,21 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti
SingletonInjector.INSTANCE.runDelayedSetup();
if (Config.Client.Advanced.Graphics.Fog.disableVanillaFog.get() && SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("bclib"))
{
ModAccessorInjector.INSTANCE.get(IBCLibAccessor.class).setRenderCustomFog(false); // Remove BCLib's fog
}
#if MC_VER >= MC_1_20_1
if (SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("sodium"))
{
ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class).setFogOcclusion(false);
}
#endif
if (ConfigBase.INSTANCE == null)
{
throw new IllegalStateException("Config was not initialized. Make sure to call LodCommonMain.initConfig() before calling this method.");
}
}
}
}
@@ -0,0 +1,46 @@
package com.seibel.distanthorizons.fabric;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.server.level.ServerPlayer;
#if MC_VER >= MC_1_20_6
import com.seibel.distanthorizons.common.CommonPacketPayload;
#else // < 1.20.6
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.minecraft.network.FriendlyByteBuf;
#endif
public class FabricPluginPacketSender extends AbstractPluginPacketSender
{
@Override
public void sendPluginPacketClient(NetworkMessage message)
{
#if MC_VER >= MC_1_20_6
ClientPlayNetworking.send(new CommonPacketPayload(message));
#else // < 1.20.6
FriendlyByteBuf buffer = PacketByteBufs.create();
// Forge packet ID
buffer.writeByte(0);
AbstractPluginPacketSender.encodeMessage(buffer, message);
ClientPlayNetworking.send(WRAPPER_PACKET_RESOURCE, buffer);
#endif
}
@Override
public void sendPluginPacketServer(ServerPlayer serverPlayer, NetworkMessage message)
{
#if MC_VER >= MC_1_20_6
ServerPlayNetworking.send(serverPlayer, new CommonPacketPayload(message));
#else // < 1.20.6
FriendlyByteBuf buffer = PacketByteBufs.create();
// Forge packet ID
buffer.writeByte(0);
AbstractPluginPacketSender.encodeMessage(buffer, message);
ServerPlayNetworking.send(serverPlayer, WRAPPER_PACKET_RESOURCE, buffer);
#endif
}
}
@@ -13,11 +13,13 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.fabric.testing.TestWorldGenBindingEvent;
import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.multiplayer.ClientLevel;
@@ -25,6 +27,14 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import org.apache.logging.log4j.Logger;
#if MC_VER >= MC_1_20_6
import com.seibel.distanthorizons.common.CommonPacketPayload;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
#else
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
#endif
import java.util.function.Supplier;
/**
@@ -54,7 +64,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
private boolean isValidTime()
{
if (isDedicated)
if (this.isDedicated)
{
return true;
}
@@ -68,6 +78,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
private ServerPlayerWrapper getServerPlayerWrapper(ServerPlayer player) { return ServerPlayerWrapper.getWrapper(player); }
/** Registers Fabric Events */
@Override
public void registerEvents()
{
LOGGER.info("Registering Fabric Server Events");
@@ -90,15 +101,15 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
//TODO: Check if both of these use the correct timed events. (i.e. is it 'ed' or 'ing' one?)
ServerLifecycleEvents.SERVER_STARTING.register((server) ->
{
if (isValidTime())
if (this.isValidTime())
{
ServerApi.INSTANCE.serverLoadEvent(isDedicated);
ServerApi.INSTANCE.serverLoadEvent(this.isDedicated);
}
});
// ServerWorldUnloadEvent
ServerLifecycleEvents.SERVER_STOPPED.register((server) ->
{
if (isValidTime())
if (this.isValidTime())
{
ServerApi.INSTANCE.serverUnloadEvent();
}
@@ -107,25 +118,25 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
// ServerLevelLoadEvent
ServerWorldEvents.LOAD.register((server, level) ->
{
if (isValidTime())
if (this.isValidTime())
{
ServerApi.INSTANCE.serverLevelLoadEvent(getServerLevelWrapper(level));
ServerApi.INSTANCE.serverLevelLoadEvent(this.getServerLevelWrapper(level));
}
});
// ServerLevelUnloadEvent
ServerWorldEvents.UNLOAD.register((server, level) ->
{
if (isValidTime())
if (this.isValidTime())
{
ServerApi.INSTANCE.serverLevelUnloadEvent(getServerLevelWrapper(level));
ServerApi.INSTANCE.serverLevelUnloadEvent(this.getServerLevelWrapper(level));
}
});
// ServerChunkLoadEvent
ServerChunkEvents.CHUNK_LOAD.register((server, chunk) ->
{
ILevelWrapper level = getServerLevelWrapper((ServerLevel) chunk.getLevel());
if (isValidTime())
ILevelWrapper level = this.getServerLevelWrapper((ServerLevel) chunk.getLevel());
if (this.isValidTime())
{
ServerApi.INSTANCE.serverChunkLoadEvent(
new ChunkWrapper(chunk, chunk.getLevel(), level),
@@ -136,18 +147,56 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) ->
{
if (isValidTime())
if (this.isValidTime())
{
ServerApi.INSTANCE.serverPlayerJoinEvent(getServerPlayerWrapper(handler.player));
ServerApi.INSTANCE.serverPlayerJoinEvent(this.getServerPlayerWrapper(handler.player));
}
});
ServerPlayConnectionEvents.DISCONNECT.register((handler, server) ->
{
if (isValidTime())
if (this.isValidTime())
{
ServerApi.INSTANCE.serverPlayerDisconnectEvent(getServerPlayerWrapper(handler.player));
ServerApi.INSTANCE.serverPlayerDisconnectEvent(this.getServerPlayerWrapper(handler.player));
}
});
ServerEntityWorldChangeEvents.AFTER_PLAYER_CHANGE_WORLD.register((player, origin, dest) ->
{
if (this.isValidTime())
{
ServerApi.INSTANCE.serverPlayerLevelChangeEvent(
this.getServerPlayerWrapper(player),
this.getServerLevelWrapper(origin),
this.getServerLevelWrapper(dest)
);
}
});
if (this.isDedicated)
{
#if MC_VER >= MC_1_20_6
PayloadTypeRegistry.playC2S().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec());
PayloadTypeRegistry.playS2C().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec());
ServerPlayNetworking.registerGlobalReceiver(CommonPacketPayload.TYPE, (payload, context) ->
{
if (payload.message() == null)
{
return;
}
ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(context.player()), payload.message());
});
#else
ServerPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE, (server, serverPlayer, handler, buffer, packetSender) ->
{
// Forge packet ID
buffer.readByte();
NetworkMessage message = AbstractPluginPacketSender.decodeMessage(buffer);
if (message != null)
{
ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(serverPlayer), message);
}
});
#endif
}
}
}
}
@@ -65,4 +65,4 @@ public class MixinClientLevel
}
#endif
}
}
@@ -21,33 +21,9 @@ import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
@Mixin(ClientPacketListener.class)
public class MixinClientPacketListener
{
@Shadow
private ClientLevel level;
@Unique
private ClientLevel previousLevel;
@Inject(method = "handleLogin", at = @At("RETURN"))
void onHandleLoginEnd(CallbackInfo ci) { ClientApi.INSTANCE.onClientOnlyConnected(); }
@Inject(method = "handleRespawn", at = @At("HEAD"))
void onHandleRespawnStart(CallbackInfo ci) { this.previousLevel = this.level; }
@Inject(method = "handleRespawn", at = @At("RETURN"))
void onHandleRespawnEnd(CallbackInfo ci)
{
// If the player changes dimensions the "this.level" will be changed halfway through the respawn method.
// By checking if the object references are the same, we can see if the previous level should be unloaded
// or if the player just respawned in the same level.
if (this.previousLevel != this.level)
{
ClientApi.INSTANCE.clientLevelUnloadEvent(ClientLevelWrapper.getWrapper(this.previousLevel));
ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level));
}
this.previousLevel = null;
}
#if MC_VER < MC_1_19_4
@Inject(method = "cleanup", at = @At("HEAD"))
#else
@@ -55,10 +31,6 @@ public class MixinClientPacketListener
#endif
void onCleanupStart(CallbackInfo ci)
{
if (this.level != null)
{
ClientApi.INSTANCE.clientLevelUnloadEvent(ClientLevelWrapper.getWrapper(this.level));
}
ClientApi.INSTANCE.onClientOnlyDisconnected();
}
@@ -72,4 +44,4 @@ public class MixinClientPacketListener
#endif
}
}
@@ -116,7 +116,7 @@ public class MixinLevelRenderer
ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level),
mcModelViewMatrix,
mcProjectionMatrix,
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
Minecraft.getInstance().getFrameTime()
#else
Minecraft.getInstance().getTimer().getRealtimeDeltaTicks()
@@ -2,6 +2,8 @@ package com.seibel.distanthorizons.fabric.mixins.client;
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.jar.installer.GitlabGetter;
@@ -12,7 +14,9 @@ import com.seibel.distanthorizons.coreapi.ModInfo;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.multiplayer.ClientLevel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -25,8 +29,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
* @author coolGi
*/
@Mixin(Minecraft.class)
public class MixinMinecraft
public abstract class MixinMinecraft
{
@Shadow
public abstract boolean isLocalServer();
@Unique
private ClientLevel lastLevel;
/**
* Can be enabled for testing the auto updater UI. <br/>
* will always show the auto updater if set to true.
@@ -113,7 +123,21 @@ public class MixinMinecraft
}
#endif
@Inject(at = @At("HEAD"), method = "updateLevelInEngines")
public void updateLevelInEngines(ClientLevel level, CallbackInfo ci)
{
if (this.lastLevel != null && level != this.lastLevel)
{
ClientApi.INSTANCE.clientLevelUnloadEvent(ClientLevelWrapper.getWrapper(this.lastLevel));
}
if (level != null)
{
ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(level, true));
}
this.lastLevel = level;
}
@Inject(at = @At("HEAD"), method = "close()V")
public void close(CallbackInfo ci) { SelfUpdater.onClose(); }
}
}
@@ -45,7 +45,7 @@ import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Shadow;
#endif
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
import net.minecraft.client.gui.screens.OptionsScreen;
#else
import net.minecraft.client.gui.screens.options.OptionsScreen;
@@ -64,7 +64,7 @@ public class MixinOptionsScreen extends Screen
/** Texture used for the config opening button */
@Unique
private static final ResourceLocation ICON_TEXTURE =
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
#else
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/button.png");
@@ -1,8 +1,6 @@
package com.seibel.distanthorizons.fabric.mixins.server;
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.common.commonMixins.MixinChunkMapCommon;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.chunk.ChunkAccess;
@@ -32,62 +30,6 @@ public class MixinChunkMap
// don't need the chunk(s) before MC has finished saving them
@Inject(method = "save", at = @At(value = "RETURN", target = CHUNK_SERIALIZER_WRITE))
private void onChunkSave(ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
{
// true means a chunk was saved to disk
if (ci.getReturnValue())
{
// TODO is this validation 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
ServerApi.INSTANCE.serverChunkSaveEvent(
new ChunkWrapper(chunk, this.level, ServerLevelWrapper.getWrapper(this.level)),
ServerLevelWrapper.getWrapper(this.level)
);
}
}
{ MixinChunkMapCommon.onChunkSave(this.level, chunk, ci); }
}
@@ -0,0 +1,77 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.fabric.mixins.server;
import com.seibel.distanthorizons.common.wrappers.misc.IMixinServerPlayer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
#if MC_VER >= MC_1_21_1
import net.minecraft.world.level.portal.DimensionTransition;
#endif
@Mixin(ServerPlayer.class)
public class MixinServerPlayer implements IMixinServerPlayer
{
@Unique
@Nullable
private ServerLevel dimensionChangeDestination;
@Override
@Nullable
public ServerLevel distantHorizons$getDimensionChangeDestination()
{
return this.dimensionChangeDestination;
}
@Inject(at = @At("HEAD"), method = "changeDimension")
#if MC_VER >= MC_1_21_1
public void changeDimension(DimensionTransition dimensionTransition, CallbackInfoReturnable<Entity> cir)
{
this.dimensionChangeDestination = dimensionTransition.newLevel();
}
#else
public void changeDimension(ServerLevel destination, CallbackInfoReturnable<Entity> cir)
{
this.dimensionChangeDestination = destination;
}
#endif
#if MC_VER >= MC_1_20_1
@Inject(at = @At("RETURN"), method = "setServerLevel")
public void setServerLevel(ServerLevel level, CallbackInfo ci)
#else
@Inject(at = @At("RETURN"), method = "setLevel")
public void setLevel(ServerLevel level, CallbackInfo ci)
#endif
{
this.dimensionChangeDestination = null;
}
}
@@ -1,16 +1,16 @@
package com.seibel.distanthorizons.fabric.testing;
import com.mojang.logging.LogUtils;
import com.seibel.distanthorizons.api.DhApi;
import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelLoadEvent;
import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiEventParam;
import com.seibel.distanthorizons.fabric.FabricServerProxy;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import net.minecraft.server.level.ServerLevel;
import org.apache.logging.log4j.Logger;
public class TestWorldGenBindingEvent extends DhApiLevelLoadEvent
{
private static final org.slf4j.Logger LOGGER = LogUtils.getLogger();
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
@Override
public void onLevelLoad(DhApiEventParam<DhApiLevelLoadEvent.EventParam> event)
@@ -9,18 +9,27 @@ import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.Abstrac
import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper;
import com.seibel.distanthorizons.api.objects.data.DhApiChunk;
import com.seibel.distanthorizons.api.objects.data.DhApiTerrainDataPoint;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.config.Config;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.chunk.ChunkAccess;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
{
private final ServerLevel level;
private final IDhApiLevelWrapper levelWrapper;
//=============//
// constructor //
//=============//
public TestWorldGenerator(ServerLevel level)
{
this.level = level;
@@ -28,13 +37,23 @@ public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
}
//============//
// properties //
//============//
@Override
public EDhApiWorldGeneratorReturnType getReturnType() { return EDhApiWorldGeneratorReturnType.API_CHUNKS; }
@Override
public boolean isBusy() { return false; }
@Override
public boolean runApiChunkValidation() { return true; }
//==================//
// chunk generation //
//==================//
@Override
public Object[] generateChunk(int chunkX, int chunkZ, EDhApiDistantGeneratorMode eDhApiDistantGeneratorMode)
{
@@ -45,10 +64,14 @@ public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
@Override
public DhApiChunk generateApiChunk(int chunkPosX, int chunkPosZ, EDhApiDistantGeneratorMode generatorMode)
{
// this test is only validated for 1.18.2 and up
// (and it is only needed when testing world gen overrides/API chunks, so it isn't normally needed)
#if MC_VER >= MC_1_18_2
ChunkAccess chunk = this.level.getChunk(chunkPosX, chunkPosZ);
int minBuildHeight = chunk.getMinBuildHeight();
int maxBuildHeight = chunk.getMaxBuildHeight();
int minBuildHeight = this.level.getMinBuildHeight();
int maxBuildHeight = this.level.getMaxBuildHeight();
DhApiChunk apiChunk = DhApiChunk.create(chunkPosX, chunkPosZ, minBuildHeight, maxBuildHeight);
for (int x = 0; x < 16; x++)
@@ -71,11 +94,20 @@ public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
}
}
return apiChunk;
#else
return null;
#endif
}
@Override
public void preGeneratorTaskStart() { /* do nothing */ }
//=========//
// cleanup //
//=========//
@Override
public void close() { /* do nothing */ }
@@ -5,7 +5,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IBCLibAcces
#elif MC_VER == MC_1_18_2
import ru.bclib.config.ClientConfig;
import ru.bclib.config.Configs;
#elif MC_VER < MC_1_21
#elif MC_VER < MC_1_21_1
import org.betterx.bclib.config.ClientConfig;
import org.betterx.bclib.config.Configs;
#endif
@@ -5,7 +5,8 @@
"mixins": [
"server.MixinChunkGenerator",
"server.MixinChunkMap",
"server.MixinUtilBackgroundThread"
"server.MixinUtilBackgroundThread",
"server.MixinServerPlayer"
],
"client": [
"client.MixinClientLevel",
@@ -24,4 +25,4 @@
"defaultRequire": 1
},
"plugin": "com.seibel.distanthorizons.fabric.mixins.FabricMixinPlugin"
}
}
+7 -5
View File
@@ -37,15 +37,17 @@ loom {
client {
client()
setConfigName("Forge Client")
ideConfigGenerated(true)
runDir("../run")
// vmArgs("-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg)
ideConfigGenerated(false)
runDir("../run/client")
vmArgs("-Dio.netty.leakDetection.level=advanced")
programArgs("--username", "Dev")
}
server {
server()
setConfigName("Forge Server")
ideConfigGenerated(true)
runDir("../run")
ideConfigGenerated(false)
runDir("../run/server")
vmArgs("-Dio.netty.leakDetection.level=advanced")
}
}
}
@@ -33,8 +33,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
//import io.netty.buffer.ByteBuf;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.client.multiplayer.ClientLevel;
@@ -53,8 +51,6 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraftforge.common.MinecraftForge;
//import net.minecraftforge.network.NetworkRegistry;
//import net.minecraftforge.network.simple.SimpleChannel;
import org.apache.logging.log4j.Logger;
import org.lwjgl.glfw.GLFW;
@@ -79,8 +75,6 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
{
private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
// private static SimpleChannel multiversePluginChannel;
#if MC_VER < MC_1_19_2
@@ -95,7 +89,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
public void registerEvents()
{
MinecraftForge.EVENT_BUS.register(this);
this.setupNetworkingListeners();
ForgePluginPacketSender.setPacketHandler(ClientApi.INSTANCE::pluginMessageReceived);
}
@@ -127,7 +121,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
#endif
{
LOGGER.info("level load");
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
@@ -139,7 +133,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
}
ClientLevel clientLevel = (ClientLevel) level;
IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel);
IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel, true);
// TODO this causes a crash due to level being set to null somewhere
ClientApi.INSTANCE.clientLevelLoadEvent(clientLevelWrapper);
}
@@ -151,7 +145,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
#endif
{
LOGGER.info("level unload");
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
@@ -176,53 +170,59 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
@SubscribeEvent
public void rightClickBlockEvent(PlayerInteractEvent.RightClickBlock event)
{
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
if (MC.clientConnectedToDedicatedServer())
{
return;
}
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
LevelAccessor level = event.getLevel();
#endif
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
if (executor != null)
{
executor.execute(() ->
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
{
ChunkAccess chunk = level.getChunk(event.getPos());
this.onBlockChangeEvent(level, chunk);
});
return;
}
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
LevelAccessor level = event.getLevel();
#endif
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
if (executor != null)
{
executor.execute(() ->
{
ChunkAccess chunk = level.getChunk(event.getPos());
this.onBlockChangeEvent(level, chunk);
});
}
}
}
@SubscribeEvent
public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event)
{
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
if (MC.clientConnectedToDedicatedServer())
{
return;
}
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
LevelAccessor level = event.getLevel();
#endif
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
if (executor != null)
{
executor.execute(() ->
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
{
ChunkAccess chunk = level.getChunk(event.getPos());
this.onBlockChangeEvent(level, chunk);
});
return;
}
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
LevelAccessor level = event.getLevel();
#endif
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
if (executor != null)
{
executor.execute(() ->
{
ChunkAccess chunk = level.getChunk(event.getPos());
this.onBlockChangeEvent(level, chunk);
});
}
}
}
private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk)
@@ -230,21 +230,16 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(level);
SharedApi.INSTANCE.chunkBlockChangedEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
}
@SubscribeEvent
public void clientChunkLoadEvent(ChunkEvent.Load event)
{
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
SharedApi.INSTANCE.chunkLoadEvent(chunk, wrappedLevel);
}
@SubscribeEvent
public void clientChunkUnloadEvent(ChunkEvent.Unload event)
{
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
SharedApi.INSTANCE.chunkUnloadEvent(chunk, wrappedLevel);
if (MC.clientConnectedToDedicatedServer())
{
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
SharedApi.INSTANCE.chunkLoadEvent(chunk, wrappedLevel);
}
}
@@ -269,66 +264,6 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
}
//============//
// networking //
//============//
public void setupNetworkingListeners()
{
// multiversePluginChannel = NetworkRegistry.newSimpleChannel(
// new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE),
// // network protocol version
// () -> ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION +"",
// // client accepted versions
// ForgeClientProxy::isReceivedProtocolVersionAcceptable,
// // server accepted versions
// ForgeClientProxy::isReceivedProtocolVersionAcceptable
// );
//
// multiversePluginChannel.registerMessage(0/*should be incremented for each simple channel we listen to*/, ByteBuf.class,
// // encoder
// (pack, friendlyByteBuf) -> { },
// // decoder
// (friendlyByteBuf) -> friendlyByteBuf.asByteBuf(),
// // message consumer
// (nettyByteBuf, contextRef) ->
// {
// ClientApi.INSTANCE.serverMessageReceived(nettyByteBuf);
// contextRef.get().setPacketHandled(true);
// }
// );
}
public static boolean isReceivedProtocolVersionAcceptable(String versionString)
{
if (versionString.toLowerCase().contains("allowvanilla"))
{
// allow using networking on vanilla servers
return true;
}
else if (versionString.toLowerCase().contains("absent"))
{
// allow using networking even if DH isn't installed on the server
return true;
}
else
{
// DH is installed on the server, check if the version is valid to use
try
{
int version = Integer.parseInt(versionString);
return ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION == version;
}
catch (NumberFormatException ignored)
{
return false;
}
}
}
//===========//
// rendering //
//===========//
@@ -362,5 +297,4 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
}
}
}
}
@@ -22,7 +22,11 @@ package com.seibel.distanthorizons.forge;
import com.mojang.brigadier.CommandDispatcher;
import com.seibel.distanthorizons.common.AbstractModInitializer;
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
@@ -34,15 +38,16 @@ import net.minecraft.commands.CommandSourceStack;
import net.minecraft.server.MinecraftServer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.*;
#if MC_VER == MC_1_16_5
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
import net.minecraftforge.fml.event.server.FMLServerAboutToStartEvent;
#elif MC_VER == MC_1_17_1
import net.minecraftforge.fmlserverevents.FMLServerStartingEvent;
import net.minecraftforge.fmlserverevents.FMLServerAboutToStartEvent;
#else
import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.event.server.ServerAboutToStartEvent;
#endif
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
#if MC_VER < MC_1_17_1
@@ -81,7 +86,11 @@ public class ForgeMain extends AbstractModInitializer
}
@Override
protected void createInitialBindings() { SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE); }
protected void createInitialBindings()
{
SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE);
SingletonInjector.INSTANCE.bind(IPluginPacketSender.class, new ForgePluginPacketSender());
}
@Override
protected IEventProxy createClientProxy() { return new ForgeClientProxy(); }
@@ -104,6 +113,20 @@ public class ForgeMain extends AbstractModInitializer
ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class,
() -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> GetConfigScreen.getScreen(parent)));
#endif
if (Config.Client.Advanced.Logging.showModCompatibilityWarningsOnStartup.get())
{
IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class);
if (modChecker.isModLoaded("alexscaves"))
{
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);
}
}
}
@Override
@@ -121,7 +144,7 @@ public class ForgeMain extends AbstractModInitializer
@Override
protected void subscribeServerStartingEvent(Consumer<MinecraftServer> eventHandler)
{
MinecraftForge.EVENT_BUS.addListener((#if MC_VER >= MC_1_18_2 ServerStartingEvent #else FMLServerStartingEvent #endif e) ->
MinecraftForge.EVENT_BUS.addListener(EventPriority.HIGH, (#if MC_VER >= MC_1_18_2 ServerAboutToStartEvent #else FMLServerAboutToStartEvent #endif e) ->
{
eventHandler.accept(e.getServer());
});
@@ -130,4 +153,4 @@ public class ForgeMain extends AbstractModInitializer
@Override
protected void runDelayedSetup() { SingletonInjector.INSTANCE.runDelayedSetup(); }
}
}
@@ -0,0 +1,130 @@
package com.seibel.distanthorizons.forge;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import net.minecraft.server.level.ServerPlayer;
#if MC_VER >= MC_1_20_2
import net.minecraftforge.network.PacketDistributor;
import net.minecraftforge.network.ChannelBuilder;
import net.minecraftforge.network.SimpleChannel;
#elif MC_VER >= MC_1_18_2
import net.minecraftforge.network.PacketDistributor;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;
#elif MC_VER >= MC_1_17_1
import net.minecraftforge.fmllegacy.network.NetworkRegistry;
import net.minecraftforge.fmllegacy.network.PacketDistributor;
import net.minecraftforge.fmllegacy.network.simple.SimpleChannel;
#else // < 1.17.1
import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.fml.network.simple.SimpleChannel;
import net.minecraftforge.fml.network.PacketDistributor;
#endif
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class ForgePluginPacketSender extends AbstractPluginPacketSender
{
public static final SimpleChannel PLUGIN_CHANNEL =
#if MC_VER >= MC_1_20_2
ChannelBuilder.named(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE)
.networkProtocolVersion(1)
.serverAcceptedVersions((status, version) -> true)
.clientAcceptedVersions((status, version) -> true)
.simpleChannel();
#else // < 1.20.2
NetworkRegistry.newSimpleChannel(
AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE,
() -> "1",
ignored -> true,
ignored -> true
);
#endif
public static void setPacketHandler(Consumer<NetworkMessage> consumer)
{
setPacketHandler((player, message) -> consumer.accept(message));
}
public static void setPacketHandler(BiConsumer<IServerPlayerWrapper, NetworkMessage> consumer)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.messageBuilder(MessageWrapper.class, 0)
.encoder((wrapper, out) -> AbstractPluginPacketSender.encodeMessage(out, wrapper.message))
.decoder(in -> new MessageWrapper(AbstractPluginPacketSender.decodeMessage(in)))
.consumerNetworkThread((wrapper, context) ->
{
if (wrapper.message != null)
{
if (context.getSender() != null)
{
consumer.accept(ServerPlayerWrapper.getWrapper(context.getSender()), wrapper.message);
}
else
{
consumer.accept(null, wrapper.message);
}
}
context.setPacketHandled(true);
})
.add();
#else // < 1.20.2
PLUGIN_CHANNEL.registerMessage(0, MessageWrapper.class,
(wrapper, out) -> AbstractPluginPacketSender.encodeMessage(out, wrapper.message),
in -> new MessageWrapper(AbstractPluginPacketSender.decodeMessage(in)),
(wrapper, context) ->
{
if (wrapper.message != null)
{
if (context.get().getSender() != null)
{
consumer.accept(ServerPlayerWrapper.getWrapper(context.get().getSender()), wrapper.message);
}
else
{
consumer.accept(null, wrapper.message);
}
}
context.get().setPacketHandled(true);
}
);
#endif
}
@Override
public void sendPluginPacketClient(NetworkMessage message)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.send(new MessageWrapper(message), PacketDistributor.SERVER.noArg());
#else // < 1.20.2
PLUGIN_CHANNEL.send(PacketDistributor.SERVER.noArg(), new MessageWrapper(message));
#endif
}
@Override
public void sendPluginPacketServer(ServerPlayer serverPlayer, NetworkMessage message)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.send(new MessageWrapper(message), PacketDistributor.PLAYER.with(serverPlayer));
#else // < 1.20.2
PLUGIN_CHANNEL.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new MessageWrapper(message));
#endif
}
// Forge doesn't support using abstract classes
@SuppressWarnings({"ClassCanBeRecord", "RedundantSuppression"})
public static class MessageWrapper
{
public final NetworkMessage message;
public MessageWrapper(NetworkMessage message)
{
this.message = message;
}
}
}
@@ -3,16 +3,20 @@ package com.seibel.distanthorizons.forge;
import com.seibel.distanthorizons.common.AbstractModInitializer;
import com.seibel.distanthorizons.common.util.ProxyUtil;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
import com.seibel.distanthorizons.core.api.internal.ServerApi;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
#if MC_VER < MC_1_19_2
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.event.world.WorldEvent;
@@ -22,6 +26,13 @@ import net.minecraftforge.event.level.LevelEvent;
#endif
import net.minecraftforge.eventbus.api.SubscribeEvent;
#if MC_VER >= MC_1_19_4
import net.minecraft.core.registries.Registries;
#else // < 1.19.4
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
#endif
#if MC_VER == MC_1_16_5
import net.minecraftforge.fml.event.server.FMLServerAboutToStartEvent;
import net.minecraftforge.fml.event.server.FMLServerStoppingEvent;
@@ -47,7 +58,6 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
#endif
private final ServerApi serverApi = ServerApi.INSTANCE;
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private final boolean isDedicated;
public static Supplier<Boolean> isGenerationThreadChecker = null;
@@ -57,6 +67,10 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
public void registerEvents()
{
MinecraftForge.EVENT_BUS.register(this);
if (this.isDedicated)
{
ForgePluginPacketSender.setPacketHandler(ServerApi.INSTANCE::pluginMessageReceived);
}
}
@@ -111,7 +125,7 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
{
if (GetEventLevel(event) instanceof ServerLevel)
{
this.serverApi.serverLevelLoadEvent(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event)));
this.serverApi.serverLevelLoadEvent(getServerLevelWrapper((ServerLevel) GetEventLevel(event)));
}
}
@@ -125,7 +139,7 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
{
if (GetEventLevel(event) instanceof ServerLevel)
{
this.serverApi.serverLevelUnloadEvent(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event)));
this.serverApi.serverLevelUnloadEvent(getServerLevelWrapper((ServerLevel) GetEventLevel(event)));
}
}
@@ -137,13 +151,25 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
this.serverApi.serverChunkLoadEvent(chunk, levelWrapper);
}
@SubscribeEvent
public void serverChunkSaveEvent(ChunkEvent.Unload event)
public void playerLoggedInEvent(PlayerEvent.PlayerLoggedInEvent event)
{
ILevelWrapper levelWrapper = ProxyUtil.getLevelWrapper(GetEventLevel(event));
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
this.serverApi.serverChunkSaveEvent(chunk, levelWrapper);
this.serverApi.serverPlayerJoinEvent(getServerPlayerWrapper(event));
}
@SubscribeEvent
public void playerLoggedOutEvent(PlayerEvent.PlayerLoggedOutEvent event)
{
this.serverApi.serverPlayerDisconnectEvent(getServerPlayerWrapper(event));
}
@SubscribeEvent
public void playerChangedDimensionEvent(PlayerEvent.PlayerChangedDimensionEvent event)
{
this.serverApi.serverPlayerLevelChangeEvent(
getServerPlayerWrapper(event),
getServerLevelWrapper(event.getFrom(), event),
getServerLevelWrapper(event.getTo(), event)
);
}
@@ -155,4 +181,20 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
private static ServerLevelWrapper getServerLevelWrapper(ServerLevel level) { return ServerLevelWrapper.getWrapper(level); }
private static ServerLevelWrapper getServerLevelWrapper(ResourceKey<Level> resourceKey, PlayerEvent event)
{
//noinspection DataFlowIssue (possible NPE after getServer())
return getServerLevelWrapper(event.getEntity().getServer().getLevel(resourceKey));
}
private static ServerPlayerWrapper getServerPlayerWrapper(PlayerEvent event) {
return ServerPlayerWrapper.getWrapper(
#if MC_VER >= MC_1_19_2
(ServerPlayer) event.getEntity()
#else
(ServerPlayer) event.getPlayer()
#endif
);
}
}
@@ -26,4 +26,4 @@ public class MixinClientPacketListener
ClientApi.INSTANCE.onClientOnlyDisconnected();
}
}
}
@@ -2,6 +2,8 @@ package com.seibel.distanthorizons.forge.mixins.client;
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.jar.installer.GitlabGetter;
@@ -11,7 +13,9 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.multiplayer.ClientLevel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
@@ -104,4 +108,4 @@ public class MixinMinecraft
SelfUpdater.onClose();
}
}
}
@@ -0,0 +1,35 @@
package com.seibel.distanthorizons.forge.mixins.server;
import com.seibel.distanthorizons.common.commonMixins.MixinChunkMapCommon;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.chunk.ChunkAccess;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ChunkMap.class)
public class MixinChunkMap
{
@Unique
private static final String CHUNK_SERIALIZER_WRITE
= "Lnet/minecraft/world/level/chunk/storage/ChunkSerializer;write(" +
"Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;)" +
"Lnet/minecraft/nbt/CompoundTag;";
@Shadow
@Final
ServerLevel level;
// firing at INVOKE causes issues with C2ME and is probably unnecessary since we
// don't need the chunk(s) before MC has finished saving them
@Inject(method = "save", at = @At(value = "RETURN", target = CHUNK_SERIALIZER_WRITE))
private void onChunkSave(ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
{ MixinChunkMapCommon.onChunkSave(this.level, chunk, ci); }
}
@@ -0,0 +1,67 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.forge.mixins.server;
import com.seibel.distanthorizons.common.wrappers.misc.IMixinServerPlayer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraftforge.common.util.ITeleporter;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ServerPlayer.class)
public class MixinServerPlayer implements IMixinServerPlayer
{
@Unique
@Nullable
private volatile ServerLevel distantHorizons$dimensionChangeDestination;
@Override
@Nullable
public ServerLevel distantHorizons$getDimensionChangeDestination()
{
return this.distantHorizons$dimensionChangeDestination;
}
@Inject(at = @At("HEAD"), method = "changeDimension", remap = false)
public void changeDimension(ServerLevel destination, ITeleporter teleporter, CallbackInfoReturnable<Entity> cir)
{
this.distantHorizons$dimensionChangeDestination = destination;
}
#if MC_VER >= MC_1_20_1
@Inject(at = @At("RETURN"), method = "setServerLevel")
public void setServerLevel(ServerLevel level, CallbackInfo ci)
#else
@Inject(at = @At("RETURN"), method = "setLevel")
public void setLevel(ServerLevel level, CallbackInfo ci)
#endif
{
this.distantHorizons$dimensionChangeDestination = null;
}
}
@@ -5,7 +5,9 @@
"mixins": [
"server.MixinUtilBackgroundThread",
"server.MixinChunkGenerator",
"server.MixinTFChunkGenerator"
"server.MixinTFChunkGenerator",
"server.MixinChunkMap",
"server.MixinServerPlayer"
],
"client": [
"client.MixinClientPacketListener",
+3 -4
View File
@@ -5,7 +5,7 @@ org.gradle.caching=true
# Mod Info
mod_name=DistantHorizons
mod_version=2.1.3-a-dev
mod_version=2.2.2-a-dev
api_version=3.0.0
maven_group=com.seibel.distanthorizons
mod_readable_name=Distant Horizons
@@ -31,7 +31,6 @@ fastutil_version=8.2.1
# Minecraft related libraries (included in MC's jar)
log4j_version=2.23.1
netty_version=4.1.94.Final
lwjgl_version=3.3.1
joml_version=1.10.2
@@ -49,7 +48,7 @@ versionStr=
# This defines what MC version Intellij will use for the preprocessor
# and what version is used automatically by build and run commands
mcVer=1.21
mcVer=1.21.1
# Defines the maximum amount of memory Minecraft is allowed when run in a development environment
#minecraftMemoryJavaArg="-Xmx4G"
#minecraftMemoryJavaArg="-Xmx4G"
+8 -6
View File
@@ -29,15 +29,17 @@ loom {
client {
client()
setConfigName("NeoForge Client")
ideConfigGenerated(true)
runDir("../run")
//vmArgs("-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg)
ideConfigGenerated(false)
runDir("../run/client")
vmArgs("-Dio.netty.leakDetection.level=advanced")
programArgs("--username", "Dev")
}
server {
server()
setConfigName("NeoForge Server")
ideConfigGenerated(true)
runDir("../run")
ideConfigGenerated(false)
runDir("../run/server")
vmArgs("-Dio.netty.leakDetection.level=advanced")
}
}
}
@@ -97,4 +99,4 @@ sourcesJar {
def commonSources = project(":common").sourcesJar
dependsOn commonSources
from commonSources.archiveFile.map { zipTree(it) }
}
}
@@ -35,7 +35,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.client.multiplayer.ClientLevel;
@@ -47,8 +46,6 @@ import net.neoforged.neoforge.event.level.LevelEvent;
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;
import net.minecraft.world.level.chunk.ChunkAccess;
//import net.neoforged.network.NetworkRegistry;
//import net.neoforged.network.simple.SimpleChannel;
import org.apache.logging.log4j.Logger;
import org.lwjgl.glfw.GLFW;
@@ -63,6 +60,8 @@ import org.lwjgl.opengl.GL32;
import net.neoforged.neoforge.event.TickEvent;
#else
import net.neoforged.neoforge.client.event.ClientTickEvent;
import java.util.concurrent.ThreadPoolExecutor;
#endif
@@ -91,7 +90,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
public void registerEvents()
{
NeoForge.EVENT_BUS.register(this);
setupNetworkingListeners();
}
@@ -135,7 +133,7 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
}
ClientLevel clientLevel = (ClientLevel) level;
IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel);
IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel, true);
// TODO this causes a crash due to level being set to null somewhere
ClientApi.INSTANCE.clientLevelLoadEvent(clientLevelWrapper);
}
@@ -164,49 +162,55 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
@SubscribeEvent
public void rightClickBlockEvent(PlayerInteractEvent.RightClickBlock event)
{
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
if (MC.clientConnectedToDedicatedServer())
{
return;
}
// executor to prevent locking up the render/event thread
// if the getChunk() takes longer than expected
// (which can be caused by certain mods)
var executor = ThreadPoolUtil.getFileHandlerExecutor();
if (executor != null)
{
executor.execute(() ->
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
{
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
LevelAccessor level = event.getLevel();
ChunkAccess chunk = level.getChunk(event.getPos());
this.onBlockChangeEvent(level, chunk);
});
return;
}
// executor to prevent locking up the render/event thread
// if the getChunk() takes longer than expected
// (which can be caused by certain mods)
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
if (executor != null)
{
executor.execute(() ->
{
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
LevelAccessor level = event.getLevel();
ChunkAccess chunk = level.getChunk(event.getPos());
this.onBlockChangeEvent(level, chunk);
});
}
}
}
@SubscribeEvent
public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event)
{
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
if (MC.clientConnectedToDedicatedServer())
{
return;
}
// executor to prevent locking up the render/event thread
// if the getChunk() takes longer than expected
// (which can be caused by certain mods)
var executor = ThreadPoolUtil.getFileHandlerExecutor();
if (executor != null)
{
executor.execute(() ->
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
{
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
LevelAccessor level = event.getLevel();
ChunkAccess chunk = level.getChunk(event.getPos());
this.onBlockChangeEvent(level, chunk);
});
return;
}
// executor to prevent locking up the render/event thread
// if the getChunk() takes longer than expected
// (which can be caused by certain mods)
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
if (executor != null)
{
executor.execute(() ->
{
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
LevelAccessor level = event.getLevel();
ChunkAccess chunk = level.getChunk(event.getPos());
this.onBlockChangeEvent(level, chunk);
});
}
}
}
private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk)
@@ -216,22 +220,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
}
@SubscribeEvent
public void clientChunkLoadEvent(ChunkEvent.Load event)
{
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
SharedApi.INSTANCE.chunkLoadEvent(chunk, wrappedLevel);
}
@SubscribeEvent
public void clientChunkUnloadEvent(ChunkEvent.Unload event)
{
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
SharedApi.INSTANCE.chunkUnloadEvent(chunk, wrappedLevel);
}
//==============//
// key bindings //
@@ -254,65 +242,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
//============//
// networking //
//============//
public static void setupNetworkingListeners()
{
// multiversePluginChannel = NetworkRegistry.newSimpleChannel(
// new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE),
// // network protocol version
// () -> ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION +"",
// // client accepted versions
// ForgeClientProxy::isReceivedProtocolVersionAcceptable,
// // server accepted versions
// ForgeClientProxy::isReceivedProtocolVersionAcceptable
// );
//
// multiversePluginChannel.registerMessage(0/*should be incremented for each simple channel we listen to*/, ByteBuf.class,
// // encoder
// (pack, friendlyByteBuf) -> { },
// // decoder
// (friendlyByteBuf) -> friendlyByteBuf.asByteBuf(),
// // message consumer
// (nettyByteBuf, contextRef) ->
// {
// ClientApi.INSTANCE.serverMessageReceived(nettyByteBuf);
// contextRef.get().setPacketHandled(true);
// }
// );
}
public static boolean isReceivedProtocolVersionAcceptable(String versionString)
{
if (versionString.toLowerCase().contains("allowvanilla"))
{
// allow using networking on vanilla servers
return true;
}
else if (versionString.toLowerCase().contains("absent"))
{
// allow using networking even if DH isn't installed on the server
return true;
}
else
{
// DH is installed on the server, check if the version is valid to use
try
{
int version = Integer.parseInt(versionString);
return ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION == version;
}
catch (NumberFormatException ignored)
{
return false;
}
}
}
//===========//
// rendering //
//===========//
@@ -355,4 +284,4 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); }
}
}
@@ -22,7 +22,11 @@ package com.seibel.distanthorizons.neoforge;
import com.mojang.brigadier.CommandDispatcher;
import com.seibel.distanthorizons.common.AbstractModInitializer;
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.api.internal.ServerApi;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
import com.seibel.distanthorizons.coreapi.ModInfo;
@@ -30,6 +34,7 @@ import com.seibel.distanthorizons.neoforge.wrappers.modAccessor.ModChecker;
import com.seibel.distanthorizons.neoforge.wrappers.modAccessor.OptifineAccessor;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.server.MinecraftServer;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModLoadingContext;
import net.neoforged.fml.common.Mod;
@@ -38,13 +43,14 @@ import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.server.ServerStartingEvent;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import java.util.function.Consumer;
#if MC_VER < MC_1_20_6
import net.neoforged.neoforge.client.ConfigScreenHandler;
#else
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
#endif
/**
@@ -53,19 +59,46 @@ import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
* check out the ClientProxy.
*/
@Mod(ModInfo.ID)
@SuppressWarnings("unused")
public class NeoforgeMain extends AbstractModInitializer
{
public NeoforgeMain(IEventBus eventBus)
{
eventBus.addListener((FMLClientSetupEvent e) -> this.onInitializeClient());
eventBus.addListener((FMLDedicatedServerSetupEvent e) -> this.onInitializeServer());
eventBus.addListener((FMLClientSetupEvent e) -> {
this.onInitializeClient();
eventBus.addListener(this::registerNetworkingClient);
});
eventBus.addListener((FMLDedicatedServerSetupEvent e) -> {
this.onInitializeServer();
eventBus.addListener(this::registerNetworkingServer);
});
}
//============//
// networking //
//============//
public void registerNetworkingClient(RegisterPayloadHandlersEvent event)
{
NeoforgePluginPacketSender.setPacketHandler(event, ClientApi.INSTANCE::pluginMessageReceived);
}
public void registerNetworkingServer(RegisterPayloadHandlersEvent event)
{
NeoforgePluginPacketSender.setPacketHandler(event, ServerApi.INSTANCE::pluginMessageReceived);
}
@Override
protected IEventProxy createServerProxy(boolean isDedicated) { return new NeoforgeServerProxy(isDedicated); }
@Override
protected void createInitialBindings() { SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE); }
protected void createInitialBindings()
{
SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE);
SingletonInjector.INSTANCE.bind(IPluginPacketSender.class, new NeoforgePluginPacketSender());
}
@Override
protected IEventProxy createClientProxy() { return new NeoforgeClientProxy(); }
@@ -83,6 +116,20 @@ public class NeoforgeMain extends AbstractModInitializer
// TODO fix potential null pointer
() -> (client, parent) -> GetConfigScreen.getScreen(parent));
#endif
if (Config.Client.Advanced.Logging.showModCompatibilityWarningsOnStartup.get())
{
IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class);
if (modChecker.isModLoaded("alexscaves"))
{
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);
}
}
}
@Override
@@ -100,10 +147,10 @@ public class NeoforgeMain extends AbstractModInitializer
@Override
protected void subscribeServerStartingEvent(Consumer<MinecraftServer> eventHandler)
{
NeoForge.EVENT_BUS.addListener((ServerStartingEvent e) -> { eventHandler.accept(e.getServer()); });
NeoForge.EVENT_BUS.addListener(EventPriority.HIGH, (ServerStartingEvent e) -> { eventHandler.accept(e.getServer()); });
}
@Override
protected void runDelayedSetup() { SingletonInjector.INSTANCE.runDelayedSetup(); }
}
}
@@ -0,0 +1,56 @@
package com.seibel.distanthorizons.neoforge;
import com.seibel.distanthorizons.common.CommonPacketPayload;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.neoforge.network.PacketDistributor;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
import java.util.Optional;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class NeoforgePluginPacketSender extends AbstractPluginPacketSender
{
private static BiConsumer<IServerPlayerWrapper, NetworkMessage> packetConsumer;
public static void setPacketHandler(RegisterPayloadHandlersEvent event, Consumer<NetworkMessage> consumer)
{
setPacketHandler(event, (player, buffer) -> consumer.accept(buffer));
}
public static void setPacketHandler(RegisterPayloadHandlersEvent event, BiConsumer<IServerPlayerWrapper, NetworkMessage> consumer)
{
packetConsumer = consumer;
PayloadRegistrar registrar = event.registrar("1").optional();
registrar.playBidirectional(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec(), (payload, context) ->
{
ServerPlayerWrapper serverPlayer = Optional.of(context.player())
.map(player -> player instanceof ServerPlayer ? (ServerPlayer) player : null)
.map(ServerPlayerWrapper::getWrapper)
.orElse(null);
if (payload.message() != null)
{
packetConsumer.accept(serverPlayer, payload.message());
}
});
}
@Override
public void sendPluginPacketClient(NetworkMessage message)
{
PacketDistributor.sendToServer(new CommonPacketPayload(message));
}
@Override
public void sendPluginPacketServer(ServerPlayer serverPlayer, NetworkMessage message)
{
PacketDistributor.sendToPlayer(serverPlayer, new CommonPacketPayload(message));
}
}
@@ -3,15 +3,20 @@ package com.seibel.distanthorizons.neoforge;
import com.seibel.distanthorizons.common.AbstractModInitializer;
import com.seibel.distanthorizons.common.util.ProxyUtil;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment;
import com.seibel.distanthorizons.core.api.internal.ServerApi;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
import net.neoforged.neoforge.event.level.ChunkEvent;
import net.neoforged.neoforge.event.level.LevelEvent;
import net.neoforged.bus.api.SubscribeEvent;
@@ -122,13 +127,25 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
this.serverApi.serverChunkLoadEvent(chunk, levelWrapper);
}
@SubscribeEvent
public void serverChunkSaveEvent(ChunkEvent.Unload event)
public void playerLoggedInEvent(PlayerEvent.PlayerLoggedInEvent event)
{
ILevelWrapper levelWrapper = ProxyUtil.getLevelWrapper(GetEventLevel(event));
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
this.serverApi.serverChunkSaveEvent(chunk, levelWrapper);
this.serverApi.serverPlayerJoinEvent(getServerPlayerWrapper(event));
}
@SubscribeEvent
public void playerLoggedOutEvent(PlayerEvent.PlayerLoggedOutEvent event)
{
this.serverApi.serverPlayerDisconnectEvent(getServerPlayerWrapper(event));
}
@SubscribeEvent
public void playerChangedDimensionEvent(PlayerEvent.PlayerChangedDimensionEvent event)
{
this.serverApi.serverPlayerLevelChangeEvent(
getServerPlayerWrapper(event),
getServerLevelWrapper(event.getFrom(), event),
getServerLevelWrapper(event.getTo(), event)
);
}
@@ -138,6 +155,15 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
//================//
private static ServerLevelWrapper getServerLevelWrapper(ServerLevel level) { return ServerLevelWrapper.getWrapper(level); }
private static ServerLevelWrapper getServerLevelWrapper(ResourceKey<Level> resourceKey, PlayerEvent event)
{
//noinspection DataFlowIssue (possible NPE after getServer())
return getServerLevelWrapper(event.getEntity().getServer().getLevel(resourceKey));
}
private static ServerPlayerWrapper getServerPlayerWrapper(PlayerEvent event)
{
return ServerPlayerWrapper.getWrapper((ServerPlayer) event.getEntity());
}
}
}
@@ -1,8 +1,11 @@
package com.seibel.distanthorizons.neoforge.mixins.client;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.multiplayer.ClientPacketListener;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -10,10 +13,16 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ClientPacketListener.class)
public class MixinClientPacketListener
{
@Shadow
private ClientLevel level;
// TODO update fabric version as well
@Inject(method = "handleLogin", at = @At("RETURN"))
void onHandleLoginEnd(CallbackInfo ci) { ClientApi.INSTANCE.onClientOnlyConnected(); }
void onHandleLoginEnd(CallbackInfo ci)
{
ClientApi.INSTANCE.onClientOnlyConnected();
ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level, true));
}
#if MC_VER < MC_1_19_4
@Inject(method = "cleanup", at = @At("HEAD"))
@@ -120,7 +120,7 @@ public class MixinLevelRenderer
float frameTime;
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
frameTime = Minecraft.getInstance().getFrameTime();
#else
frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks();
@@ -45,7 +45,7 @@ import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Shadow;
#endif
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
import net.minecraft.client.gui.screens.OptionsScreen;
#else
import net.minecraft.client.gui.screens.options.OptionsScreen;
@@ -64,7 +64,7 @@ public class MixinOptionsScreen extends Screen
/** Texture used for the config opening button */
@Unique
private static final ResourceLocation ICON_TEXTURE =
#if MC_VER < MC_1_21
#if MC_VER < MC_1_21_1
new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
#else
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/button.png");
@@ -0,0 +1,35 @@
package com.seibel.distanthorizons.neoforge.mixins.server;
import com.seibel.distanthorizons.common.commonMixins.MixinChunkMapCommon;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.chunk.ChunkAccess;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ChunkMap.class)
public class MixinChunkMap
{
@Unique
private static final String CHUNK_SERIALIZER_WRITE
= "Lnet/minecraft/world/level/chunk/storage/ChunkSerializer;write(" +
"Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;)" +
"Lnet/minecraft/nbt/CompoundTag;";
@Shadow
@Final
ServerLevel level;
// firing at INVOKE causes issues with C2ME and is probably unnecessary since we
// don't need the chunk(s) before MC has finished saving them
@Inject(method = "save", at = @At(value = "RETURN", target = CHUNK_SERIALIZER_WRITE))
private void onChunkSave(ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
{ MixinChunkMapCommon.onChunkSave(this.level, chunk, ci); }
}
@@ -0,0 +1,77 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.neoforge.mixins.server;
import com.seibel.distanthorizons.common.wrappers.misc.IMixinServerPlayer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
#if MC_VER >= MC_1_21_1
import net.minecraft.world.level.portal.DimensionTransition;
#endif
@Mixin(ServerPlayer.class)
public class MixinServerPlayer implements IMixinServerPlayer
{
@Unique
@Nullable
private ServerLevel distantHorizons$dimensionChangeDestination;
@Override
@Nullable
public ServerLevel distantHorizons$getDimensionChangeDestination()
{
return this.distantHorizons$dimensionChangeDestination;
}
@Inject(at = @At("HEAD"), method = "changeDimension")
#if MC_VER >= MC_1_21_1
public void changeDimension(DimensionTransition dimensionTransition, CallbackInfoReturnable<Entity> cir)
{
this.distantHorizons$dimensionChangeDestination = dimensionTransition.newLevel();
}
#else
public void changeDimension(ServerLevel destination, CallbackInfoReturnable<Entity> cir)
{
this.distantHorizons$dimensionChangeDestination = destination;
}
#endif
#if MC_VER >= MC_1_20_1
@Inject(at = @At("RETURN"), method = "setServerLevel")
public void setServerLevel(ServerLevel level, CallbackInfo ci)
#else
@Inject(at = @At("RETURN"), method = "setLevel")
public void setLevel(ServerLevel level, CallbackInfo ci)
#endif
{
this.distantHorizons$dimensionChangeDestination = null;
}
}
@@ -5,7 +5,9 @@
"mixins": [
"server.MixinUtilBackgroundThread",
"server.MixinChunkGenerator",
"server.MixinTFChunkGenerator"
"server.MixinTFChunkGenerator",
"server.MixinChunkMap",
"server.MixinServerPlayer"
],
"client": [
"client.MixinClientPacketListener",
+57
View File
@@ -0,0 +1,57 @@
# Usage: .\verifyall.ps1 [forge|fabric|whatever to put before ":classes"]
param (
[string]$prefix
)
# Clear the screen
Clear-Host
# Define an array to hold completed builds with color information
$completedBuilds = @()
# Get all version properties files
$versionFiles = Get-ChildItem -Path "./versionProperties/" -Filter "*.properties"
foreach ($versionFile in $versionFiles) {
$version = [System.IO.Path]::GetFileNameWithoutExtension($versionFile.Name)
# Run the gradle command
$gradleCommand = ".\gradlew $($prefix)classes -PmcVer=$version"
$process = Start-Process -FilePath "cmd.exe" -ArgumentList "/c $gradleCommand" -NoNewWindow -PassThru -Wait
# Determine the result color
if ($process.ExitCode -eq 0) {
$color = "Green"
} else {
$color = "Red"
}
# Print the result with formatting
$versionLength = $version.Length
$topChars = ("^" * $versionLength)
$bottomChars = ("=" * $versionLength)
Write-Host "# $topChars" -ForegroundColor $color
Write-Host "# $version" -ForegroundColor $color
Write-Host "# $bottomChars" -ForegroundColor $color
Write-Host
# Add result to completed builds with color
$completedBuilds += @{ Version = $version; Color = $color }
}
# Run clean and classes gradle tasks
Start-Process -FilePath "cmd.exe" -ArgumentList "/c .\gradlew clean" -NoNewWindow -Wait
Start-Process -FilePath "cmd.exe" -ArgumentList "/c .\gradlew classes" -NoNewWindow -Wait
# Print build results
Write-Host
Write-Host "Build results:"
foreach ($build in $completedBuilds) {
Write-Host $build.Version -ForegroundColor $build.Color -NoNewline
Write-Host " " -NoNewline # Add a space between versions
}
Write-Host # End the line after all versions are printed
Executable
+43
View File
@@ -0,0 +1,43 @@
#!/bin/bash
# Usage: ./verifyall.sh [forge|fabric|whatever to put before ":classes"]
if [ -n "$1" ]; then
prefix="$1:"
fi
clear
trap "echo; exit" INT
declare -a completed_builds
for version in $(ls ./versionProperties/); do
version=${version%".properties"}
result=""
if ./gradlew "$prefix"classes -PmcVer=$version; then
result+="\e[1;32m"
echo -ne "\e[1;32m"
else
result+="\e[1;31m"
echo -ne "\e[1;31m"
fi
result+=$version
result+="\e[0m"
version_length=${#version}
top_chars=$(printf '^%.0s' $(seq 1 $version_length))
bottom_chars=$(printf '=%.0s' $(seq 1 $version_length))
echo "# $top_chars"
echo "# $version"
echo "# $bottom_chars"
echo -e "\e[0m"
completed_builds+=($result)
done
./gradlew clean
./gradlew classes
echo
echo -e "\e[1mBuild results:\e[0m"
echo -e "${completed_builds[*]}"
+3
View File
@@ -7,6 +7,9 @@ accessWidenerVersion=1_16
builds_for=fabric,forge
embed_joml=true
# Netty
netty_version=4.1.25.Final
# Fabric loader
fabric_loader_version=0.14.24
fabric_api_version=0.42.0+1.16
+3
View File
@@ -7,6 +7,9 @@ accessWidenerVersion=1_17
builds_for=fabric,forge
embed_joml=true
# Netty
netty_version=4.1.25.Final
# Fabric loader
fabric_loader_version=0.14.24
fabric_api_version=0.46.1+1.17
+3
View File
@@ -7,6 +7,9 @@ accessWidenerVersion=1_18
builds_for=fabric,forge
embed_joml=true
# Netty
netty_version=4.1.68.Final
# Fabric loader
fabric_loader_version=0.14.24
fabric_api_version=0.76.0+1.18.2
+3
View File
@@ -7,6 +7,9 @@ accessWidenerVersion=1_19_2
builds_for=fabric,forge
embed_joml=true
# Netty
netty_version=4.1.77.Final
# Fabric loader
fabric_loader_version=0.14.24
fabric_api_version=0.76.1+1.19.2
+3
View File
@@ -6,6 +6,9 @@ compatible_minecraft_versions=["1.19.4"]
accessWidenerVersion=1_19_4
builds_for=fabric,forge
# Netty
netty_version=4.1.82.Final
# Fabric loader
fabric_loader_version=0.14.24
fabric_api_version=0.87.1+1.19.4
+3
View File
@@ -6,6 +6,9 @@ compatible_minecraft_versions=["1.20", "1.20.1"]
accessWidenerVersion=1_20
builds_for=fabric,forge
# Netty
netty_version=4.1.82.Final
# Fabric loader
fabric_loader_version=0.15.6
fabric_api_version=0.90.4+1.20.1
+3
View File
@@ -6,6 +6,9 @@ compatible_minecraft_versions=["1.20.2"]
accessWidenerVersion=1_20_2
builds_for=fabric,forge
# Netty
netty_version=4.1.97.Final
# Fabric loader
fabric_loader_version=0.15.6
fabric_api_version=0.90.4+1.20.2
+3
View File
@@ -7,6 +7,9 @@ accessWidenerVersion=1_20_2
builds_for=fabric,forge
# neoforge can be added once the issue with mixins has been resolved
# Netty
netty_version=4.1.97.Final
# Fabric loader
fabric_loader_version=0.15.6
fabric_api_version=0.91.2+1.20.4
+4 -1
View File
@@ -7,6 +7,9 @@ accessWidenerVersion=1_20_6
builds_for=fabric,neoforge
# forge is broken due to gradle/build script issues
# Netty
netty_version=4.1.97.Final
# Fabric loader
fabric_loader_version=0.15.10
fabric_api_version=0.97.8+1.20.6
@@ -50,4 +53,4 @@ neoforge_version=20.6.70-beta
# 2 = Can be referenced in code and runs in client
enable_starlight_forge=0
enable_terraforged=0
enable_terrafirmacraft=0
enable_terrafirmacraft=0
@@ -1,12 +1,15 @@
# 1.21 version
# 1.21.1 version
java_version=21
minecraft_version=1.21
minecraft_version=1.21.1
parchment_version=1.20.6:2024.05.01
compatible_minecraft_versions=["1.21.0"]
compatible_minecraft_versions=["1.21", "1.21.1"]
accessWidenerVersion=1_20_6
builds_for=fabric,neoforge
# forge is broken due to gradle/build script issues
# Netty
netty_version=4.1.97.Final
# Fabric loader
fabric_loader_version=0.15.11
fabric_api_version=0.100.1+1.21
@@ -38,8 +41,8 @@ fabric_api_version=0.100.1+1.21
enable_canvas=0
# (Neo)Forge loader
forge_version=50.0.19
neoforge_version=21.0.4-beta
forge_version=
neoforge_version=21.1.6
# (Neo)Forge mod versions
starlight_version_forge=
terraforged_version=
@@ -50,4 +53,4 @@ neoforge_version=21.0.4-beta
# 2 = Can be referenced in code and runs in client
enable_starlight_forge=0
enable_terraforged=0
enable_terrafirmacraft=0
enable_terrafirmacraft=0
+4
View File
@@ -0,0 +1,4 @@
Remove-Item -Recurse -Force "run/client/Distant_Horizons_server_data"
Get-ChildItem -Path "run/server" -Recurse -Filter "Distant_Horizons" | ForEach-Object { Remove-Item -Recurse -Force $_.FullName }
Get-ChildItem -Path "run/server" -Recurse -Filter "DistantHorizons.sqlite" | ForEach-Object { Remove-Item -Force $_.FullName }
Executable
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
rm -rf run/client/Distant_Horizons_server_data
rm -rf $(find run/server -name "Distant_Horizons")
rm -rf $(find run/server -name "DistantHorizons.sqlite")