Compare commits

...

268 Commits

Author SHA1 Message Date
s809 c49a61f118 Add more comments 2025-01-07 00:05:16 +05:00
s809 14cd0c4b09 Refactor thread pool handling 2025-01-06 23:32:20 +05:00
s809 2c8c1e478d Remove + on start of the line 2025-01-04 23:31:25 +05:00
s809 a444e3b974 Add comments to UPDATE_POS_MANAGER.maxSize and refactor 2025-01-04 22:11:17 +05:00
James Seibel fa61e62df9 Add more detail to CPU preset config tooltip 2025-01-04 10:02:35 -06:00
James Seibel b8037e3bea Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2025-01-04 09:48:30 -06:00
James Seibel e0baf9be93 minor jarUtil comment change 2025-01-04 09:48:22 -06:00
James Seibel 673e7d14dd make ModInfo.IS_DEV_BUILD final 2025-01-04 09:45:08 -06:00
James Seibel 4f3e867e0b Fix chunk update queue max count for multiplayer player counts
also fix variable/logging
2025-01-04 09:42:05 -06:00
James Seibel 476b96bca6 prevent infinitely growing memory when rapidly changing between dimensions 2025-01-04 09:40:32 -06:00
James Seibel 6a9986ccd3 Move networked chunk updating to the LodBuilder thread
This is done both to prevent starvation, infinitely growing tasks/memory, and simplify the AbstractDhServerLevel.updateDataSourcesAsync() method.
2025-01-04 09:40:01 -06:00
James Seibel 4dd2faad67 Hide disableUnchangedChunkCheck from the UI 2025-01-04 09:31:52 -06:00
James Seibel 9622fc3bd7 Use soft references in array pool to prevent some memory crashes
Also log if there isn't enough memory
2025-01-04 09:31:42 -06:00
James Seibel 31490f97b9 add missing "this" to QuadElementBuffer 2025-01-04 09:02:50 -06:00
James Seibel cc006ebb5d limit queued render section loading to fix memory ballooning 2025-01-04 09:02:29 -06:00
James Seibel 184f261d6b Add deprecated Purge to RateLimitedThreadPoolExecutor 2025-01-04 08:58:33 -06:00
s809 a916fe1db1 Add a comment to priority calculation 2025-01-04 19:44:23 +05:00
s809 8686e1727f Move ThreadPoolExecutor#beforeExecute into correct place 2025-01-04 19:25:30 +05:00
s809 e770943fc9 Improve task prioritization 2025-01-04 19:23:25 +05:00
s809 5a31be1e42 Fix re-queueing of positions to reload cancelling the tick 2025-01-04 19:23:25 +05:00
s809 6774a84f61 Remove unused field 2025-01-04 19:23:25 +05:00
James Seibel 770fc10cdf Add missing types to GLEnums.getString() 2025-01-03 15:58:27 -06:00
James Seibel aa8659f62d Fix sqlite memory leaks 2025-01-03 14:46:53 -06:00
s809 5c03c6d99d Check for updates on launch on dedicated servers 2025-01-03 00:30:03 +05:00
s809 56e430dff2 Rename serversideShortName to chatCommandName 2025-01-02 19:42:57 +05:00
s809 3648c83b2a Convert section pos to readable format in one of logs 2025-01-01 21:24:15 +05:00
s809 3b1f49e0b7 Group related /dh config commands 2025-01-01 19:59:35 +05:00
s809 fb78b68b96 Use correct world folder name in LAN level key prefix 2025-01-01 18:13:21 +05:00
s809 38611237ac Remove renderDistanceRadius from server config 2025-01-01 18:12:45 +05:00
James Seibel 2bbc2440fb Add validateBufferIdsBeforeRendering config 2024-12-31 09:08:10 -06:00
James Seibel 570b7d1757 Potentially fix EXCEPTION_ACCESS_VIOLATION rendering crash
Fixes a race condition where a OpenGL buffer ID may be deleted after it has been created for a different buffer object.
2024-12-31 09:07:14 -06:00
James Seibel 6d6d142cf3 Add logging when a repo has finished closing 2024-12-30 20:44:28 -06:00
James Seibel 6c23990be2 Add number formatting to migration progress log 2024-12-30 20:44:06 -06:00
James Seibel cd91ba50b9 handle corrupted inputs 2024-12-28 09:15:58 -06:00
James Seibel 8511d6e6b8 Add networking thread pool to F3 screen 2024-12-28 09:15:24 -06:00
James Seibel 64b26f0267 Fix typo preventing threadpools from running 2024-12-27 18:11:51 -06:00
James Seibel 31a65d1ce5 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-12-27 08:47:33 -06:00
James Seibel 1e3b20a672 Increase default thread preset LOW -> BALANCED 2024-12-27 08:47:03 -06:00
James Seibel 607dbdbc08 Fix f3 screen thread run time "<" 2024-12-27 08:46:46 -06:00
James Seibel 6135bdf67c Only have a single thread config
This means that CPU use will be a lot more consistent since all internal thread pools share a single thread count semaphore.
2024-12-27 08:46:32 -06:00
s809 723d93428b Respond to incompatible packets so the client is able to display an error in F3 2024-12-27 17:05:01 +05:00
s809 9447510354 Fix failed counter working incorrectly 2024-12-27 15:00:06 +05:00
James Seibel 81654123d8 Fix phantomArrayList lock overhead for large thread counts 2024-12-26 16:27:56 -06:00
s809 cde804820e Fix null pointers when generation is disabled 2024-12-26 16:08:17 +05:00
s809 29aa50fbd6 Revert "roll back part of "Prune world gen tasks above limit in multiplayer""
This reverts commit 49da0e09
2024-12-26 13:57:49 +05:00
s809 1154f23f16 Revert "re-calculate LodRenderSection missing pos every minute"
This reverts commit 7270eb8fe2.
2024-12-26 13:53:21 +05:00
s809 8904872b85 Use library provided method for filling *ArrayLists 2024-12-25 23:12:47 +05:00
s809 5dd52d3a0f Fix full data source decoding failures 2024-12-25 23:11:55 +05:00
James Seibel 810172346f Fix DH preventing server shutdown on close 2024-12-25 09:04:42 -06:00
James Seibel 248f6db82e Fix rare null pointer race condition 2024-12-24 08:12:11 -06:00
James Seibel 0ca2b2f282 minor data point ID map optimization 2024-12-23 21:40:55 -06:00
James Seibel 4d7d8cc3c0 optimize DTO memory reading 2024-12-23 20:44:34 -06:00
James Seibel 2154e53898 Add F3 screen toggling configs 2024-12-22 09:17:31 -06:00
James Seibel 75273be90a Massively optimize array pooling
Separating pools for each object/use case prevents infinitely growing arrays (also the column render source fix in 481e0411ac prevents infinitely allocating arrays)
2024-12-22 08:43:47 -06:00
James Seibel 481e0411ac Fix array leaks in LodrenderSection loading 2024-12-22 08:03:25 -06:00
James Seibel 4d8469c486 Fix F3 menu showing incorrect pooled memory size 2024-12-21 13:06:35 -06:00
James Seibel 3d866c480f Add config assumePreExistingChunksAreFinished 2024-12-20 15:25:31 -06:00
James Seibel 61a06c87c2 Fix F3 menu typo 2024-12-20 15:24:18 -06:00
James Seibel 7ab2f49f01 Rename worldGen Tasks F3 row to avoid confusion 2024-12-20 14:22:11 -06:00
James Seibel e6ceba63f7 Fix null pointer in DataSourceHandler error handler 2024-12-20 13:49:17 -06:00
James Seibel 0ba030e4aa Repo and Obj Pool rewrite
This should provide a significant reduction in garbage generated, reducing GC pressure.
2024-12-20 13:38:44 -06:00
James Seibel 7e0c10a516 add StringUtil.convertBytesToHumanReadable() 2024-12-19 17:26:16 -06:00
James Seibel 7c8c4fa6e7 minor DataTransformer optimization 2024-12-19 08:28:39 -06:00
James Seibel aaa62ccd89 Fix unnecessary string allocatino in chunkLightStorage 2024-12-14 23:35:08 -06:00
James Seibel 991c77485d Fix concurrent ChunkWrapper modifications in SharedApi 2024-12-14 20:57:22 -06:00
James Seibel de5e4a6705 Add concurrency checks to ChunkLightStorage 2024-12-14 20:57:10 -06:00
James Seibel 52917e65bc sort Lod Builder configs 2024-12-14 18:59:35 -06:00
James Seibel 8e970b1ffb Attempt to fix a rare concurrency issue in ChunkLightStorage 2024-12-14 17:49:46 -06:00
James Seibel f89cd52e5c Add debug wireframe toggle for render section rendering toggle 2024-12-14 17:24:51 -06:00
James Seibel 76b3e81cb1 rename generation mode FULL -> INTERNAL_SERVER 2024-12-14 14:05:36 -06:00
James Seibel 69050bb840 Revert "Fix holes when using Chunky"
This reverts commit d398b3bc04.
2024-12-14 12:20:12 -06:00
James Seibel 3fe60946be Revert "put shared api particle behind debug config"
This reverts commit 23021153da.
2024-12-14 12:20:09 -06:00
James Seibel 04f0b454eb re-add full (server) distant generator mode 2024-12-13 07:26:49 -06:00
James Seibel 23021153da put shared api particle behind debug config 2024-12-13 07:26:05 -06:00
James Seibel d398b3bc04 Fix holes when using Chunky
(At the cost of some minor server lag)
2024-12-12 20:56:29 -06:00
James Seibel 7270eb8fe2 re-calculate LodRenderSection missing pos every minute
Should re-implement the removed code from 49da0e09a4
2024-12-12 16:55:45 -06:00
James Seibel 49da0e09a4 roll back part of "Prune world gen tasks above limit in multiplayer"
LodRenderSection was throwing null pointers during .isFullyGenerated() due to missing null checks
2024-12-12 07:46:27 -06:00
James Seibel cf8a9dc269 fix typo in LodQuadTree 2024-12-12 07:44:05 -06:00
James Seibel 688312b5e7 up file handler runtime ratio defaults 2024-12-12 07:19:59 -06:00
James Seibel 1f0290c37b Fix thread F3 avg time >0 when runtime ratio is 1 2024-12-12 07:19:44 -06:00
James Seibel 3c5225534f Remove world gen timeout config
It didn't work as originally intended. It was originally added to prevent world gen lock-ups if a thread hits and infinite loop, but it didn't do anything for that use case and just ended up being annoying for low-end users.
2024-12-12 06:59:03 -06:00
James Seibel a24527d679 Add average thread execution time to F3 screen 2024-12-11 21:24:34 -06:00
s809 2568e08b3c Show thread preset in config entries in server command 2024-12-10 00:10:06 +05:00
s809 66337e2493 Add player into request group before trying to fulfill 2024-12-09 16:48:19 +05:00
s809 979c3788f1 Prune world gen tasks above limit in multiplayer 2024-12-09 12:03:49 +05:00
s809 2dc9b9a43f Revert "Fix gen tasks sometimes not submitting after LOD level changes"
This reverts commit 585a288f
2024-12-08 19:09:18 +05:00
James Seibel 839aee7bfc Fix typos in DhApi world (un)load events 2024-12-07 15:16:30 -06:00
James Seibel 71364d861b Fix off-by-one error in DhAPI Terrain Repo 2024-12-07 15:08:11 -06:00
James Seibel f4d1823c50 Merge branch 'distant-horizons-core-fast-hidden-block-culling' 2024-12-07 11:44:41 -06:00
James Seibel 84ddcbf38e Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-12-07 11:20:16 -06:00
James Seibel a9314510fe re-add several necessary GLState calls 2024-12-07 11:19:56 -06:00
James Seibel 821fa086e6 Replace many GL32 calls with GLMC (IMinecraftGLWrapper)
Also fix wireframe rendering
2024-12-07 09:56:36 -06:00
s809 bdd816dbda Re-add pruning of visitedPositions 2024-12-06 23:32:56 +05:00
s809 5188474101 Use N-sized generation on server when available 2024-12-06 23:10:49 +05:00
s809 b1736ce669 Remove resolved TODO 2024-12-06 20:23:41 +05:00
James Seibel 872421f39f Add start for standalone jar DB exporting 2024-12-05 18:46:57 -06:00
s809 54dd65b0a3 Merge branch 'NSizedMultiplayerTest' 2024-12-04 23:38:42 +05:00
s809 53e3c5c11c Clean up 2024-12-04 22:54:45 +05:00
James Seibel 73e5c35fc4 Add a todo comment about potential GC reduction in DTO 2024-12-03 19:26:47 -06:00
s809 0b4fa1b2ed Up protocol version 2024-12-03 21:23:37 +05:00
s809 585a288f68 Fix gen tasks sometimes not submitting after LOD level changes 2024-12-03 21:10:58 +05:00
s809 56db5d7e1a Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core into NSizedMultiplayerTest 2024-12-02 21:17:46 +05:00
James Seibel af932c5bc9 Add visited position removal timer in RemoteFullDataSourceProvider
This is done to hopefully prevent memory leaks
2024-12-02 07:51:07 -06:00
s809 aa5c4aa9c4 Lower log level of out of range warning 2024-11-22 14:54:37 +05:00
s809 97943107f7 Up protocol version 2024-11-22 14:49:39 +05:00
s809 00fd3c236a Fix config description indentation 2024-11-22 14:44:25 +05:00
s809 0f2e007eff Fix config descriptions & clean up 2024-11-22 13:29:06 +05:00
s809 36b719c361 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core into feature/generation-distance-limiting 2024-11-22 12:51:35 +05:00
James Seibel 7455893ef8 Fix race condition in LodRenderSection loading 2024-11-21 19:00:27 -06:00
James Seibel b909214974 Fix caught null pointer 2024-11-21 17:21:14 -06:00
s809 b59965671c Make generation limit work 2024-11-22 00:16:30 +05:00
s809 cf5ba685f4 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core into feature/generation-distance-limiting 2024-11-21 22:10:31 +05:00
James Seibel 23c160e948 Accidentally flipped an assertion last commit 2024-11-21 07:41:31 -06:00
James Seibel 6ff2c9f14c improve columnRenderbuffer assertion message 2024-11-21 07:17:20 -06:00
s809 d1b63f11a5 Merge branch 'main' into 'main'
Fix distant-horizons#870 : Correctly template regex

See merge request distant-horizons-team/distant-horizons-core!73
2024-11-20 16:27:44 +00:00
helpimnotdrowning f7926456a3 Fix distant-horizons#870: Correctly template regex 2024-11-19 16:15:23 -06:00
James Seibel eb749d6bb0 Fix a rare error where chunk lighting is set to -1 2024-11-18 07:46:24 -06:00
James Seibel deaccf53f9 Fix sometimes not loading high-detail LODs when on a server 2024-11-18 07:40:16 -06:00
James Seibel 9f966f0643 Remove manifold string plugin 2024-11-17 08:03:04 -06:00
James Seibel bcc44ab5e3 Add player's DhSectionPos to the F3 menu 2024-11-17 06:22:48 -06:00
James Seibel 37dd0c4d55 up version number 2.3.0-a -> 2.3.0-b 2024-11-16 22:07:31 -06:00
James Seibel 6595f5d90e Fix fog shader compiling on some software renderers 2024-11-16 21:57:58 -06:00
s809 587ea7017c Fail subsequent requests for already pending LOD 2024-11-15 18:06:33 +05:00
s809 74e8487fe4 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core into feature/generation-distance-limiting 2024-11-15 12:30:14 +05:00
s809 f5fc0004d5 Replace Apache's base32 with guava 2024-11-15 09:32:51 +05:00
s809 5fe6c2cb7b Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core into feature/generation-distance-limiting 2024-11-14 17:00:54 +05:00
s809 f92a1ccc27 Add a comment to #pluginMessageReceived methods 2024-11-14 15:52:41 +05:00
s809 5448b8890d Replace truncating the hashed seed with encoding it into base32 2024-11-14 15:23:35 +05:00
James Seibel 127ec81ade Add AbstractConfigType.typeIsFloatingPointNumber() 2024-11-13 18:26:20 -06:00
s809 3d11a208d7 Move request handling to another class and rewrite group locking logic 2024-11-13 18:20:57 +05:00
James Seibel 937b36bfa2 Catch a few FullDataSourceV2 Repo closed exceptions 2024-11-13 07:00:31 -06:00
James Seibel 7f761e415f Fix potential null pointers if other mods mess with the MVM or Proj matricies 2024-11-12 07:27:41 -06:00
s809 eeae8dbdc5 WIP generation distance limiting 2024-11-12 12:25:29 +05:00
s809 15b2d56d8c Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core into NSizedMultiplayerTest 2024-11-12 12:07:22 +05:00
James Seibel ea55750c4b Hopefully fix some file path complaints for test files 2024-11-11 07:45:18 -06:00
James Seibel 8a61266651 fix level.getHashedSeed() and re-add default getDhIdentifier() 2024-11-09 21:17:09 -06:00
James Seibel de548c9a5e Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-11-09 20:58:48 -06:00
James Seibel 6413725eae Fix height fog 2024-11-09 20:58:45 -06:00
s809 bd264086e3 Remove seed hash from local & server worlds, and expose DH's level identifier to API 2024-11-09 22:36:25 +05:00
James Seibel 52452e356d fix upload canceling 2024-11-09 09:53:28 -06:00
James Seibel 6321a6f9af Attempt to fix concurrency in generic render direct rendering 2024-11-09 09:51:54 -06:00
James Seibel b0f2918daf Fix GLProxy renderThread skipping some tasks 2024-11-09 09:48:37 -06:00
James Seibel 9351b7b834 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-11-09 08:48:42 -06:00
James Seibel adce15f648 Improve Buffer uploading speed and remove buffer upload thread 2024-11-09 08:48:18 -06:00
coolGi 6699c4c452 Updated readme to use the new DH links 2024-11-09 14:42:47 +00:00
James Seibel ea1d79a1a6 Add todo to GenericObjRenderer about potential crash 2024-11-08 07:41:22 -06:00
James Seibel 0fb7131631 deprectate MC_CLIENT.executeOnRenderThread()
Use GLProxy instead
2024-11-08 07:41:02 -06:00
James Seibel 13b9e9b0d9 (test) remove GLProxy render thread timeout
This should cause upload tasks to finish much faster but will cause stuttering if too many tasks build up
2024-11-08 07:40:37 -06:00
James Seibel bbd6f2ea89 Move some buffer building logic off the render thread 2024-11-08 07:39:58 -06:00
James Seibel 32b9e723d1 Fix crashing after server shutdown in serverPlayerDisconnectEvent 2024-11-06 07:08:17 -06:00
James Seibel 14db049148 Fix unnecessary logging for JarUtil jarFile getting
Closes #733
2024-11-05 07:32:44 -06:00
James Seibel f8b1b8378a Fix Concurrent modification in DhServerWorld 2024-11-05 07:16:09 -06:00
James Seibel f396a650b4 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-11-04 18:29:08 -06:00
James Seibel 1dffedccb9 Add hashed seed to server level folders to replace multiverse similarity 2024-11-04 18:29:03 -06:00
s809 534684328e Fix Flashback crash on dimension loading 2024-11-03 19:20:14 +05:00
James Seibel 573c9912db add IChunkWrapper debug method 2024-11-02 13:08:26 -05:00
James Seibel f3af6ce74b add recalculate heightmap config (disabled by default) 2024-11-02 13:06:27 -05:00
James Seibel b7fccae64d Prep for MC 1.21.3 support 2024-11-02 11:19:29 -05:00
James Seibel 6fccaab841 Fix potential RejectedExecutionException error in ServerLevel 2024-11-02 11:19:10 -05:00
James Seibel 7e88ec4cc1 Improve ChunkLightStorage error logging 2024-11-01 18:07:42 -05:00
James Seibel 072fc0cb66 remove unused part of RenderUtil.shouldLodsRender() 2024-11-01 18:06:17 -05:00
James Seibel 5da0314556 Rename DummyRunExecutorService -> RunOnThisThreadExecutorService 2024-11-01 18:05:33 -05:00
James Seibel 415f0bb866 Remove unneeded ClientApi events 2024-10-31 20:28:43 -05:00
s809 13ab18d763 Add section splitting 2024-10-31 16:00:43 +05:00
James Seibel 23b2a62db2 proof-of-concept n-sized multiplayer request support 2024-10-27 16:14:56 -05:00
James Seibel 2dd83d182f Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-10-27 16:12:33 -05:00
James Seibel b7c06dd4ba fix update error pos log 2024-10-26 10:38:36 -05:00
James Seibel 1819569090 Fix manifold IDE issue 2024-10-26 10:37:55 -05:00
James Seibel 6cd8172ad2 Increase the default render distance 128 -> 256 2024-10-26 08:48:26 -05:00
s809 695fe10546 Fix too many chunks spam 2024-10-26 00:33:41 +05:00
s809 ea92ef1fd3 Set limit to infinite if maxDataTransferSpeed is 0 2024-10-25 23:59:02 +05:00
James Seibel 0e3d978a1f Cache arrays used by RenderableBoxGroup 2024-10-25 07:40:25 -05:00
James Seibel 240a29803c Improve generic object profiling 2024-10-25 07:40:04 -05:00
James Seibel b09b9d1b6f Fix cloud colors not updating 2024-10-24 22:02:35 -05:00
James Seibel d1923ee6b5 Fix generic renderer not using material type 2024-10-24 07:13:24 -05:00
James Seibel 9a05ffa730 Update logos in _misc Files 2024-10-24 06:59:56 -05:00
James Seibel 2a46f0349f Slightly increase DH cloud speed 2024-10-22 16:26:02 -05:00
James Seibel 58a756361e Fix DH fade corrupting the GL state 2024-10-22 16:25:54 -05:00
James Seibel eefbe1bba9 add cloud test grid for potential future use 2024-10-22 15:33:41 -05:00
James Seibel f4bcfa52c7 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core 2024-10-22 15:32:37 -05:00
James Seibel f2815c4e25 Change the cloud texture to smooth transitions 2024-10-22 15:30:07 -05:00
s809 45f4bd6949 Fix zero queue length in multiplayer 2024-10-22 23:54:56 +05:00
James Seibel 4d4a3d44fd CloudRenderHandler minor refactor 2024-10-22 12:23:50 -04:00
James Seibel 61cde9902f Increase far clip plane distance slightly 2024-10-22 12:21:58 -04:00
James Seibel a8ce63529c Optimize cloud rendering and cull clouds behind camera 2024-10-22 12:19:19 -04:00
James Seibel f7521ece83 Don't log overloaded messages on clients 2024-10-21 14:05:59 -04:00
James Seibel ab7fea580b Potentially fix DH fading causing rendering issues with Create 2024-10-21 13:56:54 -04:00
James Seibel 32154b2580 re-add overloaded warning log and config for chat messages
chat messages are disabled by default
2024-10-21 13:43:09 -04:00
James Seibel fd794cd55d Center update propagation around player position
This is done to make world gen appear faster since the LODs will be made visible sooner
2024-10-21 08:52:52 -04:00
s809 f94b55ff00 Fix incomplete buffers being released 2024-10-21 16:43:11 +05:00
s809 b8a862ddd8 Multiply update queue size by player count 2024-10-20 20:00:02 +05:00
s809 271f128de6 Make sure data source received from file handler is fully generated before sending to client 2024-10-20 15:15:04 +05:00
s809 c4ea887b03 Move commands under /dh, add /dh debug command 2024-10-20 15:14:03 +05:00
s809 d12e797732 Up protocol version 2024-10-18 11:16:53 +05:00
s809 afdbc47758 Rename CurrentLevelKeyMessage to LevelInitMessage and add server time offset calculation 2024-10-18 11:16:20 +05:00
s809 bea1ff34b4 Add LOD transfer speed setting 2024-10-18 01:08:12 +05:00
James Seibel 4a7881fbb5 Add ColorUtil.toColorInt() 2024-10-16 14:22:47 -04:00
James Seibel 06c7d84b57 minor columnRenderBuffer refactoring 2024-10-16 14:22:31 -04:00
James Seibel 59767c807b Fix javadoc compiling 2024-10-15 07:43:23 -05:00
James Seibel 82e1587c4e Replace JOptionPane's with TinyFD to fix some Mac issues 2024-10-15 07:43:13 -05:00
James Seibel 69a5fdc720 Fix default beacon culling setting 2024-10-14 07:40:57 -05:00
James Seibel bd6e6b47bb Split the config file, update the config UI, and remove a few unused configs 2024-10-12 20:39:11 -05:00
James Seibel 633ee7f0f9 Fix N-sized world gen causing holes when moving 2024-10-12 09:53:40 -05:00
James Seibel fd86826325 Reduce file handler task count when updating QuadTree nodes 2024-10-11 22:13:23 -05:00
James Seibel e721c59127 Merge !71 (Fix adjacent chunk lighting) 2024-10-11 21:59:10 -05:00
James Seibel fb42d19513 Fix LOD only mode near clip plane 2024-10-11 07:46:09 -05:00
James Seibel 4a8f802a57 Fix light references in SubDimensionLevelMatcher 2024-10-11 07:33:49 -05:00
James Seibel 65336860d2 Add proof-of-concept standalone jar DB parsing 2024-10-10 07:43:43 -05:00
James Seibel 01da4eb430 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-10-08 20:17:14 -05:00
James Seibel bec3b5b576 Fix world gen incorrectly returning some data sources to the pool 2024-10-08 20:17:11 -05:00
James Seibel 3b5208d774 Fix File Handler threads sometimes looping infinitely 2024-10-08 19:51:39 -05:00
s809 0925f20cac Fix incorrect name of a method 2024-10-08 22:58:56 +05:00
s809 f350e8a2f9 Fix incorrect folder being used without level keys 2024-10-08 22:37:51 +05:00
James Seibel 2d8bad9aec Decrease vertical quality drop off 2024-10-08 07:51:34 -05:00
James Seibel 20fedc7d6d Merge !70 (make DH's near clip plane unaffected by FOV) 2024-10-08 07:19:09 -05:00
James Seibel 4b07f6c8e4 minor ColumnRenderSource refactor 2024-10-08 07:08:51 -05:00
James Seibel f91d3d1ec2 Prevent returning out of bounds ColumnArrayView's 2024-10-08 07:07:48 -05:00
s809 e97e16e7d1 Fix keyed levels not changing 2024-10-08 09:04:54 +05:00
James Seibel 1b59a269e6 Update the API to allow for N-sized world generation requests
This breaks old world generators
2024-10-07 19:45:28 -05:00
James Seibel 28ec1e2960 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-10-07 19:45:19 -05:00
James Seibel 1449ceb22c Move API terrain data point creation into its own class 2024-10-07 17:23:31 -05:00
James Seibel 71581fb88a Allow world generation to queue for N-sized sections 2024-10-07 17:13:41 -05:00
James Seibel d86a0dc2b0 refactoring/renaming before adding N-sized world gen 2024-10-06 08:29:39 -05:00
James Seibel 1d8ac571cf Fix LOD sections not reloading correctly and showing old/empty data 2024-10-06 08:28:24 -05:00
s809 31fdf9fa43 Fix unhandled message spam in replay mod 2024-10-06 01:44:56 +05:00
s809 cc8a2a70e8 Use level key prefixes to in LAN multiplayer 2024-10-06 00:19:42 +05:00
s809 2aca8acaf6 Change level key prefix comment 2024-10-05 21:58:30 +05:00
s809 38d7ca4bec Prevent server crash on shutdown 2024-10-05 21:29:58 +05:00
s809 c1a405b755 Decouple beacon beam data handling from render handling, send beacon beams to clients 2024-10-05 14:03:02 +05:00
James Seibel 0b49d1a007 Close !69 (add IDhApiLevelWrapper.getDhSaveFolder()) 2024-10-04 07:45:53 -05:00
James Seibel 3fb4c254c1 Improve beacon fade rendering 2024-10-03 20:25:23 -05:00
James Seibel fcb933a2dd Fix zoom mods breaking DH's fade/near clip plane 2024-10-03 17:25:49 -05:00
James Seibel ea4d4bf955 Improve fade config, add localization, and add fading to the quality presets 2024-10-03 17:10:51 -05:00
James Seibel 38f3b46f8a Fix fade rendering when DH rendering is disabled 2024-10-02 18:16:32 -05:00
James Seibel b77828f984 replace random noise with Bayer for dithering 2024-10-02 18:08:53 -05:00
James Seibel ec151d398e Fix the near clip plane appearing at high vanilla render distances 2024-10-02 07:49:20 -05:00
James Seibel 85c00e50d9 Improve dithering quality 2024-10-02 07:35:32 -05:00
James Seibel fbaff8d850 Add dithered DH fading, double pass fading, and fix LOD clouds 2024-10-01 22:02:32 -05:00
James Seibel 72607a4fc9 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-09-30 21:59:39 -05:00
James Seibel f63e3d4b6d Add experimental DH/vanilla fading 2024-09-30 21:59:19 -05:00
s809 f9d008ef78 Fix real-time updates being sent to non-ready players 2024-09-29 22:45:36 +05:00
s809 7f0c42396b Use more correct distance function for real-time updates 2024-09-29 22:24:38 +05:00
James Seibel db524efba0 Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons-core 2024-09-28 15:27:53 -05:00
s809 54cf9782ae Do not sync sections after generation, fix incorrect timestamp fetch pos range calculation 2024-09-29 01:17:59 +05:00
James Seibel a37a2c9c9d Capitalize EWorldEnvironment variables 2024-09-28 14:31:41 -05:00
James Seibel 03c7b48c5d Remove multiverse similarity percent and add IDhApiSaveStructure
Similarity percent should no longer be needed since the server support was added
2024-09-28 14:30:34 -05:00
James Seibel 5af706daa0 deprecate multiverse config 2024-09-28 11:06:32 -05:00
James Seibel 53bccbb161 Rename AbstractSaveStructure -> ISaveStructure 2024-09-28 11:06:26 -05:00
James Seibel 8547e78d9d Add Dh level tostring() methods 2024-09-28 10:22:38 -05:00
James Seibel 2aec3d980e Fix F3 menu showing the same level multiple times 2024-09-28 10:22:21 -05:00
James Seibel 566b536c8d Add Api world load/unload events and DhApiWorldProxy.get/setReadOnly() 2024-09-28 08:33:19 -05:00
James Seibel d89d99f126 Add temporary vertical Quality CUSTOM option 2024-09-26 22:34:10 -05:00
James Seibel c06283d403 Add hashCode() to FullDataPointIdMap 2024-09-26 07:42:24 -05:00
James Seibel fd0a4c55ac Change FullDataSourceDTO checksum/hash logic to hopefully be more consistent 2024-09-25 21:57:49 -05:00
James Seibel b0aa211464 Fix default generic rendering instanced mode 2024-09-25 18:44:39 -05:00
James Seibel 14e7918ea0 fix readme logo filepaths 2024-09-22 17:25:14 -05:00
James Seibel 524ea77ce5 Update readme logos 2024-09-22 17:23:35 -05:00
James Seibel 9f763bcd6a Add new logos 2024-09-22 17:18:33 -05:00
James Seibel 166875283c Fix cloud debug colors 2024-09-22 16:53:27 -05:00
James Seibel abb264bdf0 Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core 2024-09-22 16:32:21 -05:00
James Seibel 70aa5724a9 Closes !68 (Allow toggling generic obj instanced rendering via config) 2024-09-22 16:32:10 -05:00
James Seibel 520d37f410 Add generic obj cube count to F3 menu 2024-09-22 16:31:06 -05:00
s809 29c2756e75 Merge branch 'feature/lan-support' 2024-09-23 00:46:30 +05:00
s809 6c278ea3b1 LAN multiplayer kinda works 2024-09-23 00:02:31 +05:00
s809 b18460b825 Abstract away serverside parts of world & level 2024-09-22 03:28:53 +05:00
James Seibel d0b50d9633 Add Sqlite library validation to Initializer 2024-09-21 11:45:44 -05:00
James Seibel c051b3584f Replace "jdbc:sqlite" with a constant 2024-09-21 11:43:58 -05:00
James Seibel d4cad8f718 Fix config file handler corruption due to reading/writing concurrently 2024-09-20 07:29:32 -05:00
288 changed files with 12279 additions and 8780 deletions
+1 -1
View File
@@ -537,7 +537,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
+1
View File
@@ -0,0 +1 @@
Distant Horizons logos © 2024 by Pankakes are licensed under CC BY-SA 4.0
+3 -3
View File
@@ -1,10 +1,10 @@
# Distant Horizons
# <img src="https://gitlab.com/distant-horizons-team/distant-horizons-core/-/raw/main/_Misc%20Files/logo%20files/new/SVG/Distant-Horizons-Core.svg" height="128px">
This repo is for the Distant Horizons mod.
The purpose of this submodule is to isolate code that isn't tied to a specific version of minecraft. This prevents us from having duplicate code; reducing errors and potentially helping us port to different versions faster and easier.
The purpose of this submodule is to isolate code that isn't tied to a specific version of minecraft. This prevents us from having duplicate code; reducing errors and helping us port to different versions faster and easier.
Check out the mod's main GitLab page here:
https://gitlab.com/jeseibel/distant-horizons
https://gitlab.com/distant-horizons-team/distant-horizons
## source code installation
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 899.94 1023">
<defs>
<style>
.cls-1 {
fill: #7ec138;
}
.cls-2 {
fill: #fff;
}
.cls-3 {
fill: #12af68;
}
</style>
</defs>
<g id="Layer_15">
<g>
<g>
<path d="M899.94,260.54c0-17.71-9.16-33.58-24.5-42.44l-141.37-81.64c-8.37-4.84-17.91-7.39-27.58-7.39s-19.21,2.56-27.58,7.39l-9.95,5.75c.82-3.59,1.27-7.31,1.27-11.12,0-17.71-9.16-33.58-24.5-42.44L504.97,7.39c-8.37-4.83-17.91-7.39-27.58-7.39s-19.21,2.56-27.58,7.39l-140.78,81.3c-15.34,8.86-24.5,24.73-24.5,42.44,0,.34.03.67.03,1l-45.34-26.17c-8.37-4.83-17.91-7.39-27.58-7.39s-19.2,2.55-27.58,7.39L42.7,187.57c-15.34,8.86-24.5,24.72-24.5,42.44,0,17.06,8.51,32.38,22.83,41.4-23.23,3.84-41.03,24.01-41.03,48.32v162.23c0,19.64,10.57,37.95,27.58,47.77l2.71,1.56v221.34c0,19.79,10.55,38.07,27.69,47.97l367.81,212.5c22.86,13.21,51.04,13.21,73.9,0l367.8-212.45c17.14-9.9,27.69-28.19,27.69-47.97v-429.48c0-10.87-2.42-21.39-6.83-30.94,7.41-8.68,11.59-19.77,11.59-31.71Z"/>
<path class="cls-1" d="M42.85,503.28l141.58,81.73c12.31,7.11,27.7-1.78,27.7-15.99v-162.23c0-8.8-4.69-16.93-12.31-21.33l-141.58-81.73c-12.31-7.11-27.7,1.78-27.7,15.99v162.23c0,8.8,4.69,16.93,12.31,21.33Z"/>
</g>
<g>
<path class="cls-1" d="M682.81,673.17v168.68c0,11.85,12.82,19.25,23.08,13.33l146.2-84.37c7.62-4.4,12.32-12.53,12.32-21.33v-168.7c0-11.85-12.82-19.25-23.08-13.33l-146.2,84.4c-7.62,4.4-12.31,12.53-12.31,21.33Z"/>
<path id="_x3C_Path_x3E_" class="cls-2" d="M476.59,552.87v42.73c0,14.22,15.39,23.1,27.7,15.99l36.93-21.32c7.62-4.4,12.31-12.53,12.31-21.32v-42.73c0-14.22-15.39-23.1-27.7-15.99l-36.93,21.32c-7.62,4.4-12.31,12.53-12.31,21.32Z"/>
<g id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_">
<path class="cls-3" d="M293.15,393.42l37.53,21.67c7.62,4.4,17,4.4,24.62,0l37.53-21.67c12.31-7.11,12.31-24.88,0-31.99l-37.53-21.67c-7.62-4.4-17-4.4-24.62,0l-37.53,21.67c-12.31,7.11-12.31,24.88,0,31.99Z"/>
</g>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-2" d="M403.03,481.64l46.77,27c7.62,4.4,17,4.4,24.62,0l46.77-27c8.21-4.74,8.21-16.59,0-21.32l-46.77-27c-7.62-4.4-17-4.4-24.62,0l-46.77,27c-8.21,4.74-8.21,16.59,0,21.32Z"/>
</g>
<path id="Left__x3C_Path_x3E_" class="cls-3" d="M384.25,710.23l36.93,21.32c12.31,7.11,27.7-1.78,27.7-15.99v-42.75c0-8.8-4.69-16.93-12.32-21.33l-36.93-21.32c-12.31-7.11-27.7,1.78-27.7,15.99v42.75c0,8.8,4.69,16.93,12.32,21.33Z"/>
<path class="cls-1" d="M73.38,770.26l141.58,81.73c12.31,7.11,27.7-1.78,27.7-15.99v-162.23c0-8.8-4.69-16.93-12.31-21.33l-141.58-81.73c-12.31-7.11-27.7,1.78-27.7,15.99v162.23c0,8.8,4.69,16.93,12.31,21.33Z"/>
<path class="cls-1" d="M282.68,891.09l138.51,79.95c12.31,7.11,27.7-1.78,27.7-15.99v-162.23c0-8.8-4.69-16.93-12.31-21.32l-138.51-79.97c-12.31-7.11-27.7,1.78-27.7,15.99v162.26c0,8.8,4.69,16.93,12.31,21.33Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-2" d="M384.25,590.25l36.94,21.34c12.31,7.11,27.7-1.77,27.7-15.99v-42.74c0-8.8-4.69-16.93-12.32-21.33l-36.93-21.32c-12.31-7.11-27.7,1.78-27.7,15.99v42.72c0,8.8,4.69,16.92,12.31,21.32Z"/>
<path class="cls-3" d="M273.52,642.44l36.93,21.32c12.31,7.11,27.7-1.78,27.7-15.99v-162.7c0-8.8-4.69-16.92-12.31-21.32l-36.94-21.34c-12.31-7.11-27.7,1.77-27.7,15.99v162.72c0,8.8,4.69,16.93,12.31,21.33Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-3" d="M578.16,494.23v42.72c0,14.22,15.39,23.1,27.7,15.99l36.93-21.32c7.61-4.4,12.31-12.52,12.31-21.31l.02-42.74c0-14.22-15.39-23.11-27.7-16l-36.95,21.34c-7.62,4.4-12.31,12.53-12.31,21.32Z"/>
<path class="cls-1" d="M324.3,147.12l140.78,81.24c7.62,4.4,17,4.4,24.62,0l140.76-81.27c12.31-7.11,12.31-24.88,0-31.99l-140.75-81.27c-7.62-4.4-17.01-4.4-24.63,0l-140.78,81.3c-12.31,7.11-12.31,24.88,0,31.99Z"/>
<path class="cls-1" d="M553.45,276.16l141.35,81.64c7.62,4.4,17.01,4.4,24.63,0l140.75-81.27c12.31-7.11,12.31-24.88,0-31.99l-141.37-81.64c-7.62-4.4-17.01-4.4-24.63,0l-140.73,81.27c-12.31,7.11-12.31,24.88,0,31.98Z"/>
<path class="cls-1" d="M682.81,433.81v162.7c0,14.21,15.39,23.1,27.7,16l141.58-81.71c7.62-4.4,12.32-12.53,12.32-21.33v-162.72c0-14.22-15.39-23.1-27.7-15.99l-141.58,81.73c-7.62,4.4-12.31,12.53-12.31,21.33Z"/>
<path class="cls-1" d="M476.59,792.09v163.35c0,14.21,15.37,23.09,27.68,16.01l138.53-79.74c7.63-4.39,12.34-12.53,12.34-21.34v-163.35c0-14.21-15.37-23.09-27.68-16.01l-138.53,79.74c-7.63,4.39-12.34,12.53-12.34,21.34Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-3" d="M476.59,672.8v42.75c0,14.22,15.39,23.1,27.7,15.99l138.51-79.95c7.62-4.4,12.31-12.53,12.31-21.33v-42.75c0-14.22-15.39-23.1-27.7-15.99l-138.51,79.95c-7.62,4.4-12.31,12.53-12.31,21.33Z"/>
<path class="cls-1" d="M57.96,246l140.75,81.27c7.62,4.4,17.01,4.4,24.63,0l141.34-81.63c12.31-7.11,12.31-24.88,0-31.99l-140.73-81.24c-7.62-4.4-17-4.4-24.62,0L57.97,214.01c-12.31,7.11-12.31,24.88,0,31.99Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-3" d="M428.16,351.42l141.39,81.63c7.62,4.4,17,4.4,24.62,0l36.9-21.31c12.31-7.11,12.31-24.88,0-31.99l-141.39-81.63c-7.62-4.4-17-4.4-24.62,0l-36.9,21.31c-12.31,7.11-12.31,24.88,0,31.99Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2891.6 1023">
<defs>
<style>
.cls-1 {
fill: #7ec138;
}
.cls-2 {
fill: #fff;
}
.cls-3 {
fill: #12af68;
}
</style>
</defs>
<g id="Layer_15">
<g>
<path d="M2864.43,472.26v-8.85c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.85c0-5.06-4.1-9.16-9.16-9.16h-162.78c-5.06,0-9.16,4.1-9.16,9.16v8.85c0,5.06-4.1,9.16-9.16,9.16h-18.02c-5.06,0-9.16-4.1-9.16-9.16v-8.85c0-5.06-4.1-9.16-9.16-9.16h-81.22c-5.06,0-9.16,4.1-9.16,9.16v8.85c0,5.06-4.1,9.16-9.16,9.16h-18.02c-5.06,0-9.16-4.1-9.16-9.16v-8.85c0-5.06-4.1-9.16-9.16-9.16h-8.89c-5.06,0-9.16-4.1-9.16-9.16v-126.74c0-5.06,4.1-9.16,9.16-9.16h36.06c5.06,0,9.16-4.1,9.16-9.16v-57.07c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-11.88c0-5.06-4.1-9.16-9.16-9.16h-271.51c-5.06,0-9.16,4.1-9.16,9.16v11.88c0,5.06-4.1,9.16-9.16,9.16h-18.02c-5.06,0-9.16-4.1-9.16-9.16v-11.88c0-5.06-4.1-9.16-9.16-9.16h-81.22c-5.06,0-9.16,4.1-9.16,9.16v11.88c0,5.06-4.1,9.16-9.16,9.16h-18.02c-5.06,0-9.16-4.1-9.16-9.16v-11.88c0-5.06-4.1-9.16-9.16-9.16h-570.48c-5.06,0-9.16,4.1-9.16,9.16v11.88c0,5.06-4.1,9.16-9.16,9.16h-18.01c-5.06,0-9.16-4.1-9.16-9.16v-11.88c0-5.06-4.1-9.16-9.16-9.16h-81.22c-5.06,0-9.16,4.1-9.16,9.16v39.05c0,5.06-4.1,9.16-9.16,9.16h-18.01c-5.06,0-9.16-4.1-9.16-9.16v-8.85c0-5.06-4.1-9.16-9.16-9.16h-8.89c-5.06,0-9.16-4.1-9.16-9.16v-11.88c0-5.06-4.1-9.16-9.16-9.16h-165.71c-5.06,0-9.16,4.1-9.16,9.16v220.12c0,5.06,4.1,9.16,9.16,9.16h1.12c5.06,0,9.16,4.1,9.16,9.16h0c0,5.06-4.1,9.16-9.16,9.16h-1.12c-5.06,0-9.16,4.1-9.16,9.16v207.97c0,5.06,4.1,9.16,9.16,9.16h1.12c5.06,0,9.16,4.1,9.16,9.16v30.53c0,5.06-4.1,9.16-9.16,9.16h-1.12c-5.06,0-9.16,4.1-9.16,9.16v191.37c0,5.06,4.1,9.16,9.16,9.16h7.23c5.06,0,9.16,4.1,9.16,9.16v9.17c0,5.06,4.1,9.16,9.16,9.16h88.59c5.06,0,9.16-4.1,9.16-9.16v-9.16c0-5.06,4.1-9.16,9.16-9.16h18.33c5.06,0,9.16,4.1,9.16,9.16v9.16c0,5.06,4.1,9.16,9.16,9.16h186.87c5.06,0,9.16-4.1,9.16-9.16v-36.64c0-5.06,4.1-9.16,9.16-9.16h87.9c5.06,0,9.16,4.1,9.16,9.16v9.16c0,5.06,4.1,9.16,9.16,9.16h15.26c5.06,0,9.16,4.1,9.16,9.15v9.17c0,5.06,4.1,9.16,9.16,9.16h87.08c5.06,0,9.16-4.1,9.16-9.16v-226.53c0-5.06,4.1-9.16,9.16-9.16h480.86c5.06,0,9.16-4.1,9.16-9.16v-9.16c0-5.06,4.1-9.16,9.16-9.16h21.37c5.06,0,9.16,4.1,9.16,9.16v9.16c0,5.06,4.1,9.16,9.16,9.16h161.83c5.06,0,9.16-4.1,9.16-9.16v-9.16c0-5.06,4.1-9.16,9.16-9.16h21.37c5.06,0,9.16,4.1,9.16,9.16v9.16c0,5.06,4.1,9.16,9.16,9.16h79.39c5.06,0,9.16-4.1,9.16-9.16v-9.16c0-5.06,4.1-9.16,9.16-9.16h21.37c5.06,0,9.16,4.1,9.16,9.16v9.16c0,5.06,4.1,9.16,9.16,9.16h79.39c5.06,0,9.16-4.1,9.16-9.16v-9.16c0-5.06,4.1-9.16,9.16-9.16h21.37c5.06,0,9.16,4.1,9.16,9.16v9.16c0,5.06,4.1,9.16,9.16,9.16h143.43c5.06,0,9.16-4.1,9.16-9.16v-8.52c0-5.06,4.1-9.16,9.16-9.16h8.85c5.06,0,9.16-4.1,9.16-9.16v-174.06c0-5.06-4.1-9.16-9.16-9.16h-8.85c-5.06,0-9.16-4.1-9.16-9.16Z"/>
<path id="Horizons" class="cls-1" d="M2787.46,494.87v-8.86c0-5.06-4.1-9.16-9.16-9.16h-63.22c-5.06,0-9.16,4.1-9.16,9.16v36.04c0,5.06,4.1,9.16,9.16,9.16h90.4c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v36.04c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-117.57c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h36.04c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h63.22c5.06,0,9.16-4.1,9.16-9.16v-36.04c0-5.06-4.1-9.16-9.16-9.16h-90.4c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-36.04c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h117.57c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16ZM2588.05,449.67h-36.04c-5.06,0-9.16,4.1-9.16,9.16v63.22c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-36.04c-5.06,0-9.16,4.1-9.16,9.16v171.93c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-90.4c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v36.04c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-171.93c0-5.06-4.1-9.16-9.16-9.16ZM2334.58,476.85h8.86c5.06,0,9.16,4.1,9.16,9.16v117.57c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-117.57c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-117.57c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h117.57c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16ZM2225.86,612.74h63.22c5.06,0,9.16-4.1,9.16-9.16v-117.57c0-5.06-4.1-9.16-9.16-9.16h-63.22c-5.06,0-9.16,4.1-9.16,9.16v117.57c0,5.06,4.1,9.16,9.16,9.16ZM2098.83,449.67h-171.93c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h90.4c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v36.04c0,5.06,4.1,9.16,9.16,9.16h171.93c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-90.4c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-36.04c0-5.06-4.1-9.16-9.16-9.16ZM1863.38,630.76v-171.93c0-5.06-4.1-9.16-9.16-9.16h-36.04c-5.06,0-9.16,4.1-9.16,9.16v171.93c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16ZM1745.5,531.2h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v63.22c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-63.22c0-5.06-4.1-9.16-9.16-9.16h-63.22c-5.06,0-9.16,4.1-9.16,9.16v63.22c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-171.93c0-5.06,4.1-9.16,9.16-9.16h144.75c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v36.04c0,5.06-4.1,9.16-9.16,9.16ZM1700.3,522.04v-36.04c0-5.06-4.1-9.16-9.16-9.16h-63.22c-5.06,0-9.16,4.1-9.16,9.16v36.04c0,5.06,4.1,9.16,9.16,9.16h63.22c5.06,0,9.16-4.1,9.16-9.16ZM1492.03,476.85h8.86c5.06,0,9.16,4.1,9.16,9.16v117.57c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-117.57c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-117.57c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h117.57c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16ZM1455.69,603.58v-117.57c0-5.06-4.1-9.16-9.16-9.16h-63.22c-5.06,0-9.16,4.1-9.16,9.16v117.57c0,5.06,4.1,9.16,9.16,9.16h63.22c5.06,0,9.16-4.1,9.16-9.16ZM1256.28,449.67h-36.04c-5.06,0-9.16,4.1-9.16,9.16v63.22c0,5.06-4.1,9.16-9.16,9.16h-63.22c-5.06,0-9.16-4.1-9.16-9.16v-63.22c0-5.06-4.1-9.16-9.16-9.16h-36.04c-5.06,0-9.16,4.1-9.16,9.16v171.93c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-63.22c0-5.06,4.1-9.16,9.16-9.16h63.22c5.06,0,9.16,4.1,9.16,9.16v63.22c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-171.93c0-5.06-4.1-9.16-9.16-9.16Z"/>
<g id="Distant">
<path class="cls-2" d="M2461.31,214.22v8.86c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16,4.1-9.16,9.16v144.75c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-144.75c0-5.06-4.1-9.16-9.16-9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h144.75c5.06,0,9.16,4.1,9.16,9.16ZM2261.9,205.06h-36.04c-5.06,0-9.16,4.1-9.16,9.16v63.22c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-36.04c-5.06,0-9.16,4.1-9.16,9.16v171.93c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-90.4c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v36.04c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-171.93c0-5.06-4.1-9.16-9.16-9.16ZM2008.43,241.3h8.86c5.06,0,9.16,4.1,9.16,9.16v135.69c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-36.04c0-5.06-4.1-9.16-9.16-9.16h-63.22c-5.06,0-9.16,4.1-9.16,9.16v36.04c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-135.69c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-17.92c0-5.06,4.1-9.16,9.16-9.16h117.57c5.06,0,9.16,4.1,9.16,9.16v17.92c0,5.06,4.1,9.16,9.16,9.16ZM1972.09,304.61v-63.22c0-5.06-4.1-9.16-9.16-9.16h-63.22c-5.06,0-9.16,4.1-9.16,9.16v63.22c0,5.06,4.1,9.16,9.16,9.16h63.22c5.06,0,9.16-4.1,9.16-9.16ZM1799.86,205.06h-144.75c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16,4.1,9.16,9.16v144.75c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-144.75c0-5.06,4.1-9.16,9.16-9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16ZM1573.57,259.41h36.04c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-117.57c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v36.04c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h90.4c5.06,0,9.16,4.1,9.16,9.16v36.04c0,5.06-4.1,9.16-9.16,9.16h-63.22c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-36.04c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h117.57c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-36.04c0-5.06-4.1-9.16-9.16-9.16h-8.86c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-90.4c-5.06,0-9.16-4.1-9.16-9.16v-36.04c0-5.06,4.1-9.16,9.16-9.16h63.22c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16ZM1374.15,386.15v-171.93c0-5.06-4.1-9.16-9.16-9.16h-36.04c-5.06,0-9.16,4.1-9.16,9.16v171.93c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16ZM1247.42,259.41h8.86c5.06,0,9.16,4.1,9.16,9.16v63.22c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-117.57c-5.06,0-9.16-4.1-9.16-9.16v-171.93c0-5.06,4.1-9.16,9.16-9.16h117.57c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16ZM1193.06,340.95h14.9c5.06,0,9.16-4.1,9.16-9.16v-63.22c0-5.06-4.1-9.16-9.16-9.16h-14.9c-5.06,0-9.16-4.1-9.16-9.16v-8.86c0-5.06-4.1-9.16-9.16-9.16h-36.04c-5.06,0-9.16,4.1-9.16,9.16v117.57c0,5.06,4.1,9.16,9.16,9.16h36.04c5.06,0,9.16-4.1,9.16-9.16v-8.86c0-5.06,4.1-9.16,9.16-9.16Z"/>
</g>
<path class="cls-3" d="M1564.41,875.37v-171.93c0-5.06,4.1-9.16,9.16-9.16h36.04c5.06,0,9.16,4.1,9.16,9.16v171.93c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16ZM1510.05,730.62v63.22c0,5.06-4.1,9.16-9.16,9.16h-8.86c-5.06,0-9.16,4.1-9.16,9.16v8.86c0,5.06-4.1,9.16-9.16,9.16h-90.4c-5.06,0-9.16,4.1-9.16,9.16v36.04c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-171.93c0-5.06,4.1-9.16,9.16-9.16h144.75c5.06,0,9.16,4.1,9.16,9.16v8.86c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16ZM1446.53,721.46h-63.22c-5.06,0-9.16,4.1-9.16,9.16v63.22c0,5.06,4.1,9.16,9.16,9.16h63.22c5.06,0,9.16-4.1,9.16-9.16v-63.22c0-5.06-4.1-9.16-9.16-9.16ZM1265.44,739.68v135.69c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-36.04c0-5.06-4.1-9.16-9.16-9.16h-63.22c-5.06,0-9.16,4.1-9.16,9.16v36.04c0,5.06-4.1,9.16-9.16,9.16h-36.04c-5.06,0-9.16-4.1-9.16-9.16v-135.69c0-5.06,4.1-9.16,9.16-9.16h8.86c5.06,0,9.16-4.1,9.16-9.16v-17.92c0-5.06,4.1-9.16,9.16-9.16h117.57c5.06,0,9.16,4.1,9.16,9.16v17.92c0,5.06,4.1,9.16,9.16,9.16h8.86c5.06,0,9.16,4.1,9.16,9.16ZM1201.92,721.46h-63.22c-5.06,0-9.16,4.1-9.16,9.16v63.22c0,5.06,4.1,9.16,9.16,9.16h63.22c5.06,0,9.16-4.1,9.16-9.16v-63.22c0-5.06-4.1-9.16-9.16-9.16Z"/>
</g>
<g>
<g>
<path d="M899.94,260.54c0-17.71-9.16-33.58-24.5-42.44l-141.37-81.64c-8.37-4.84-17.91-7.39-27.58-7.39s-19.21,2.56-27.58,7.39l-9.95,5.75c.82-3.59,1.27-7.31,1.27-11.12,0-17.71-9.16-33.58-24.5-42.44L504.97,7.39c-8.37-4.83-17.91-7.39-27.58-7.39s-19.21,2.56-27.58,7.39l-140.78,81.3c-15.34,8.86-24.5,24.73-24.5,42.44,0,.34.03.67.03,1l-45.34-26.17c-8.37-4.83-17.91-7.39-27.58-7.39s-19.2,2.55-27.58,7.39L42.7,187.57c-15.34,8.86-24.5,24.72-24.5,42.44,0,17.06,8.51,32.38,22.83,41.4-23.23,3.84-41.03,24.01-41.03,48.32v162.23c0,19.64,10.57,37.95,27.58,47.77l2.71,1.56v221.34c0,19.79,10.55,38.07,27.69,47.97l367.81,212.5c22.86,13.21,51.04,13.21,73.9,0l367.8-212.45c17.14-9.9,27.69-28.19,27.69-47.97v-429.48c0-10.87-2.42-21.39-6.83-30.94,7.41-8.68,11.59-19.77,11.59-31.71Z"/>
<path class="cls-1" d="M42.85,503.28l141.58,81.73c12.31,7.11,27.7-1.78,27.7-15.99v-162.23c0-8.8-4.69-16.93-12.31-21.33l-141.58-81.73c-12.31-7.11-27.7,1.78-27.7,15.99v162.23c0,8.8,4.69,16.93,12.31,21.33Z"/>
</g>
<g>
<path class="cls-1" d="M682.81,673.17v168.68c0,11.85,12.82,19.25,23.08,13.33l146.2-84.37c7.62-4.4,12.32-12.53,12.32-21.33v-168.7c0-11.85-12.82-19.25-23.08-13.33l-146.2,84.4c-7.62,4.4-12.31,12.53-12.31,21.33Z"/>
<path id="_x3C_Path_x3E_" class="cls-2" d="M476.59,552.87v42.73c0,14.22,15.39,23.1,27.7,15.99l36.93-21.32c7.62-4.4,12.31-12.53,12.31-21.32v-42.73c0-14.22-15.39-23.1-27.7-15.99l-36.93,21.32c-7.62,4.4-12.31,12.53-12.31,21.32Z"/>
<g id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_">
<path class="cls-3" d="M293.15,393.42l37.53,21.67c7.62,4.4,17,4.4,24.62,0l37.53-21.67c12.31-7.11,12.31-24.88,0-31.99l-37.53-21.67c-7.62-4.4-17-4.4-24.62,0l-37.53,21.67c-12.31,7.11-12.31,24.88,0,31.99Z"/>
</g>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-2" d="M403.03,481.64l46.77,27c7.62,4.4,17,4.4,24.62,0l46.77-27c8.21-4.74,8.21-16.59,0-21.32l-46.77-27c-7.62-4.4-17-4.4-24.62,0l-46.77,27c-8.21,4.74-8.21,16.59,0,21.32Z"/>
</g>
<path id="Left__x3C_Path_x3E_" class="cls-3" d="M384.25,710.23l36.93,21.32c12.31,7.11,27.7-1.78,27.7-15.99v-42.75c0-8.8-4.69-16.93-12.32-21.33l-36.93-21.32c-12.31-7.11-27.7,1.78-27.7,15.99v42.75c0,8.8,4.69,16.93,12.32,21.33Z"/>
<path class="cls-1" d="M73.38,770.26l141.58,81.73c12.31,7.11,27.7-1.78,27.7-15.99v-162.23c0-8.8-4.69-16.93-12.31-21.33l-141.58-81.73c-12.31-7.11-27.7,1.78-27.7,15.99v162.23c0,8.8,4.69,16.93,12.31,21.33Z"/>
<path class="cls-1" d="M282.68,891.09l138.51,79.95c12.31,7.11,27.7-1.78,27.7-15.99v-162.23c0-8.8-4.69-16.93-12.31-21.32l-138.51-79.97c-12.31-7.11-27.7,1.78-27.7,15.99v162.26c0,8.8,4.69,16.93,12.31,21.33Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-2" d="M384.25,590.25l36.94,21.34c12.31,7.11,27.7-1.77,27.7-15.99v-42.74c0-8.8-4.69-16.93-12.32-21.33l-36.93-21.32c-12.31-7.11-27.7,1.78-27.7,15.99v42.72c0,8.8,4.69,16.92,12.31,21.32Z"/>
<path class="cls-3" d="M273.52,642.44l36.93,21.32c12.31,7.11,27.7-1.78,27.7-15.99v-162.7c0-8.8-4.69-16.92-12.31-21.32l-36.94-21.34c-12.31-7.11-27.7,1.77-27.7,15.99v162.72c0,8.8,4.69,16.93,12.31,21.33Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-3" d="M578.16,494.23v42.72c0,14.22,15.39,23.1,27.7,15.99l36.93-21.32c7.61-4.4,12.31-12.52,12.31-21.31l.02-42.74c0-14.22-15.39-23.11-27.7-16l-36.95,21.34c-7.62,4.4-12.31,12.53-12.31,21.32Z"/>
<path class="cls-1" d="M324.3,147.12l140.78,81.24c7.62,4.4,17,4.4,24.62,0l140.76-81.27c12.31-7.11,12.31-24.88,0-31.99l-140.75-81.27c-7.62-4.4-17.01-4.4-24.63,0l-140.78,81.3c-12.31,7.11-12.31,24.88,0,31.99Z"/>
<path class="cls-1" d="M553.45,276.16l141.35,81.64c7.62,4.4,17.01,4.4,24.63,0l140.75-81.27c12.31-7.11,12.31-24.88,0-31.99l-141.37-81.64c-7.62-4.4-17.01-4.4-24.63,0l-140.73,81.27c-12.31,7.11-12.31,24.88,0,31.98Z"/>
<path class="cls-1" d="M682.81,433.81v162.7c0,14.21,15.39,23.1,27.7,16l141.58-81.71c7.62-4.4,12.32-12.53,12.32-21.33v-162.72c0-14.22-15.39-23.1-27.7-15.99l-141.58,81.73c-7.62,4.4-12.31,12.53-12.31,21.33Z"/>
<path class="cls-1" d="M476.59,792.09v163.35c0,14.21,15.37,23.09,27.68,16.01l138.53-79.74c7.63-4.39,12.34-12.53,12.34-21.34v-163.35c0-14.21-15.37-23.09-27.68-16.01l-138.53,79.74c-7.63,4.39-12.34,12.53-12.34,21.34Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-3" d="M476.59,672.8v42.75c0,14.22,15.39,23.1,27.7,15.99l138.51-79.95c7.62-4.4,12.31-12.53,12.31-21.33v-42.75c0-14.22-15.39-23.1-27.7-15.99l-138.51,79.95c-7.62,4.4-12.31,12.53-12.31,21.33Z"/>
<path class="cls-1" d="M57.96,246l140.75,81.27c7.62,4.4,17.01,4.4,24.63,0l141.34-81.63c12.31-7.11,12.31-24.88,0-31.99l-140.73-81.24c-7.62-4.4-17-4.4-24.62,0L57.97,214.01c-12.31,7.11-12.31,24.88,0,31.99Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-3" d="M428.16,351.42l141.39,81.63c7.62,4.4,17,4.4,24.62,0l36.9-21.31c12.31-7.11,12.31-24.88,0-31.99l-141.39-81.63c-7.62-4.4-17-4.4-24.62,0l-36.9,21.31c-12.31,7.11-12.31,24.88,0,31.99Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 899.55 1023">
<defs>
<style>
.cls-1 {
fill: #fff;
}
.cls-2 {
fill: #e13e1e;
}
.cls-3 {
fill: #fea138;
}
</style>
</defs>
<g id="Layer_13">
<g>
<path id="Outline" d="M488.21,1012.7l382.54-220.96c17.82-10.29,28.8-29.31,28.8-49.9v-446.69c0-27.45-14.64-52.81-38.41-66.53L478.59,7.72c-17.83-10.3-39.8-10.3-57.63,0L38.41,228.62C14.64,242.35,0,267.71,0,295.15v446.64c0,20.58,10.98,39.6,28.8,49.89l382.55,221.01c23.78,13.74,53.08,13.74,76.86,0Z"/>
<g>
<path class="cls-2" d="M678.66,659.16v175.44c0,12.32,13.34,20.02,24.01,13.86l152.06-87.75c7.93-4.57,12.81-13.03,12.81-22.18v-175.46c0-12.32-13.34-20.02-24.01-13.86l-152.06,87.78c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path id="_x3C_Path_x3E_" class="cls-1" d="M464.18,534.03v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.03,12.8-22.18v-44.44c0-14.79-16.01-24.03-28.81-16.63l-38.41,22.18c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_" class="cls-3" d="M289.27,403.13l39.04,22.54c7.92,4.57,17.69,4.57,25.61,0l39.04-22.54c12.8-7.39,12.8-25.88,0-33.27l-39.04-22.54c-7.92-4.57-17.69-4.57-25.61,0l-39.04,22.54c-12.8,7.39-12.8,25.88,0,33.27Z"/>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-1" d="M387.68,459.95l48.64,28.08c7.92,4.57,17.69,4.57,25.61,0l48.64-28.08c8.54-4.93,8.54-17.25,0-22.18l-48.64-28.08c-7.92-4.57-17.69-4.57-25.61,0l-48.64,28.08c-8.54,4.93-8.54,17.25,0,22.18Z"/>
</g>
<path id="Left__x3C_Path_x3E_" class="cls-3" d="M368.15,697.7l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-44.46c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.46c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path class="cls-2" d="M44.82,760.13l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
<path class="cls-2" d="M262.5,885.81l144.06,83.15c12.8,7.39,28.81-1.85,28.81-16.64v-168.73c0-9.15-4.88-17.6-12.8-22.18l-144.06-83.18c-12.8-7.39-28.81,1.85-28.81,16.63v168.76c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-1" d="M368.14,572.91l38.42,22.19c12.8,7.4,28.81-1.84,28.81-16.63v-44.45c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.43c0,9.15,4.88,17.6,12.8,22.18Z"/>
<path class="cls-3" d="M262.5,636.72l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-169.22c0-9.15-4.88-17.6-12.8-22.18l-38.42-22.19c-12.8-7.4-28.81,1.84-28.81,16.63v169.23c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-3" d="M569.82,473.04v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.02,12.8-22.17l.02-44.45c0-14.79-16-24.04-28.81-16.64l-38.43,22.19c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-3" d="M397.94,340.39l147.05,84.9c7.92,4.57,17.69,4.57,25.61,0l38.38-22.16c12.8-7.39,12.8-25.88,0-33.27l-147.05-84.9c-7.92-4.57-17.69-4.57-25.61,0l-38.38,22.16c-12.8,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-2" d="M289.91,153.31l146.42,84.5c7.92,4.57,17.68,4.57,25.61,0l146.4-84.53c12.8-7.39,12.8-25.87,0-33.27l-146.39-84.52c-7.92-4.58-17.69-4.58-25.61,0l-146.42,84.55c-12.81,7.39-12.8,25.88,0,33.27Z"/>
<path class="cls-2" d="M506.01,278l147.01,84.91c7.92,4.58,17.69,4.58,25.61,0l146.39-84.52c12.8-7.39,12.8-25.87,0-33.27l-147.03-84.91c-7.92-4.58-17.69-4.58-25.61,0l-146.37,84.52c-12.8,7.39-12.8,25.87,0,33.27Z"/>
<path class="cls-2" d="M678.66,410.2v169.21c0,14.78,16,24.03,28.81,16.64l147.26-84.98c7.93-4.57,12.81-13.03,12.81-22.18v-169.24c0-14.79-16.01-24.03-28.81-16.63l-147.26,85.01c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-2" d="M464.18,782.84v169.9c0,14.77,15.98,24.02,28.79,16.65l144.08-82.94c7.94-4.57,12.83-13.03,12.83-22.2v-169.9c0-14.77-15.98-24.02-28.79-16.65l-144.08,82.94c-7.94,4.57-12.83,13.03-12.83,22.2Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-3" d="M464.18,658.77v44.46c0,14.79,16,24.03,28.81,16.64l144.06-83.15c7.92-4.57,12.81-13.03,12.81-22.18v-44.46c0-14.79-16-24.03-28.81-16.64l-144.06,83.15c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-2" d="M73.24,278.38l146.39,84.52c7.93,4.58,17.69,4.58,25.61,0l147.01-84.91c12.8-7.39,12.8-25.88,0-33.27l-146.36-84.5c-7.92-4.57-17.68-4.57-25.61,0l-147.03,84.88c-12.81,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-2" d="M44.82,511.04l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2975.95 1023">
<defs>
<style>
.cls-1 {
fill: #fff;
}
.cls-2 {
fill: #e13e1e;
}
.cls-3 {
fill: #fea138;
}
</style>
</defs>
<g id="Layer_13">
<g>
<path d="M2947.69,450.19v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-169.3c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-84.47c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.24c-5.26,0-9.53-4.27-9.53-9.53v-131.82c0-5.26,4.27-9.53,9.53-9.53h37.51c5.26,0,9.53-4.27,9.53-9.53v-59.36c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-282.39c-5.26,0-9.53,4.27-9.53,9.53v12.35c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-84.47c-5.26,0-9.53,4.27-9.53,9.53v12.35c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-593.33c-5.26,0-9.53,4.27-9.53,9.53v12.35c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-84.48c-5.26,0-9.53,4.27-9.53,9.53v40.62c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.24c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-172.35c-5.26,0-9.53,4.27-9.53,9.53v228.94c0,5.26,4.27,9.53,9.53,9.53h1.16c5.26,0,9.53,4.27,9.53,9.53h0c0,5.26-4.27,9.53-9.53,9.53h-1.16c-5.26,0-9.53,4.27-9.53,9.53v216.3c0,5.26,4.27,9.53,9.53,9.53h1.16c5.26,0,9.53,4.27,9.53,9.53v22.23c0,5.26-4.26,9.53-9.53,9.53h-1.16c-5.26,0-9.53,4.27-9.53,9.53v179.99c0,5.26,4.27,9.53,9.53,9.53h7.51c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h13.87c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h169.41c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h194.64c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.26-9.53,9.53-9.53h22.23c5.26,0,9.53,4.26,9.53,9.52v9.54c0,5.26,4.27,9.53,9.53,9.53h79.48c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h308.1c5.26,0,9.53-4.27,9.53-9.53v-94.84c0-5.26-4.27-9.53-9.53-9.53h-9.53c-5.26,0-9.53-4.27-9.53-9.53v-73.04c0-5.26,4.27-9.53,9.53-9.53h9.53c5.26,0,9.53-4.27,9.53-9.53v-29.61c0-5.26,4.27-9.53,9.53-9.53h133.25c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h168.32c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h82.57c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h82.57c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h149.18c5.26,0,9.53-4.27,9.53-9.53v-8.86c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-181.04c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53Z"/>
<path id="Horizons" class="cls-2" d="M2867.64,473.7v-9.21c0-5.26-4.27-9.53-9.53-9.53h-65.75c-5.26,0-9.53,4.27-9.53,9.53v37.48c0,5.26,4.27,9.53,9.53,9.53h94.02c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v37.48c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-122.29c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h37.48c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h65.75c5.26,0,9.53-4.27,9.53-9.53v-37.48c0-5.26-4.27-9.53-9.53-9.53h-94.02c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-37.48c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h122.29c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-37.48c-5.26,0-9.53-4.27-9.53-9.53ZM2660.24,426.7h-37.48c-5.26,0-9.53,4.27-9.53,9.53v65.75c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-37.48c-5.26,0-9.53,4.27-9.53,9.53v178.82c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-94.02c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v37.48c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-178.82c0-5.26-4.27-9.53-9.53-9.53ZM2396.61,454.96h9.21c5.26,0,9.53,4.27,9.53,9.53v122.29c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-122.29c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-122.29c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h122.29c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53ZM2283.54,596.3h65.75c5.26,0,9.53-4.27,9.53-9.53v-122.29c0-5.26-4.27-9.53-9.53-9.53h-65.75c-5.26,0-9.53,4.27-9.53,9.53v122.29c0,5.26,4.27,9.53,9.53,9.53ZM2151.42,426.7h-178.82c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h94.02c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v37.48c0,5.26,4.27,9.53,9.53,9.53h178.82c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-94.02c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-37.48c0-5.26-4.27-9.53-9.53-9.53ZM1906.53,615.04v-178.82c0-5.26-4.27-9.53-9.53-9.53h-37.48c-5.26,0-9.53,4.27-9.53,9.53v178.82c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53ZM1783.93,511.5h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v65.75c0,5.26-4.27,9.53-9.53,9.53h-37.48c-5.26,0-9.53-4.27-9.53-9.53v-65.75c0-5.26-4.27-9.53-9.53-9.53h-65.75c-5.26,0-9.53,4.27-9.53,9.53v65.75c0,5.26-4.27,9.53-9.53,9.53h-37.48c-5.26,0-9.53-4.27-9.53-9.53v-178.82c0-5.26,4.27-9.53,9.53-9.53h150.55c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v37.48c0,5.26-4.27,9.53-9.53,9.53ZM1736.92,501.97v-37.48c0-5.26-4.27-9.53-9.53-9.53h-65.75c-5.26,0-9.53,4.27-9.53,9.53v37.48c0,5.26,4.27,9.53,9.53,9.53h65.75c5.26,0,9.53-4.27,9.53-9.53ZM1520.31,454.96h9.21c5.26,0,9.53,4.27,9.53,9.53v122.29c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-122.29c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-122.29c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h122.29c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53ZM1482.51,586.78v-122.29c0-5.26-4.27-9.53-9.53-9.53h-65.75c-5.26,0-9.53,4.27-9.53,9.53v122.29c0,5.26,4.27,9.53,9.53,9.53h65.75c5.26,0,9.53-4.27,9.53-9.53ZM1275.11,426.7h-37.48c-5.26,0-9.53,4.27-9.53,9.53v65.75c0,5.26-4.27,9.53-9.53,9.53h-65.75c-5.26,0-9.53-4.27-9.53-9.53v-65.75c0-5.26-4.27-9.53-9.53-9.53h-37.48c-5.26,0-9.53,4.27-9.53,9.53v178.82c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-65.75c0-5.26,4.27-9.53,9.53-9.53h65.75c5.26,0,9.53,4.27,9.53,9.53v65.75c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-178.82c0-5.26-4.27-9.53-9.53-9.53Z"/>
<g id="Distant">
<path class="cls-1" d="M2528.43,181.81v9.21c0,5.26-4.27,9.53-9.53,9.53h-37.48c-5.26,0-9.53,4.27-9.53,9.53v150.55c0,5.26-4.27,9.53-9.53,9.53h-37.48c-5.26,0-9.53-4.27-9.53-9.53v-150.55c0-5.26-4.27-9.53-9.53-9.53h-37.48c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h150.55c5.26,0,9.53,4.27,9.53,9.53ZM2321.02,172.28h-37.48c-5.26,0-9.53,4.27-9.53,9.53v65.75c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-37.48c-5.26,0-9.53,4.27-9.53,9.53v178.82c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-94.02c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v37.48c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-178.82c0-5.26-4.27-9.53-9.53-9.53ZM2057.4,209.97h9.21c5.26,0,9.53,4.27,9.53,9.53v141.13c0,5.26-4.27,9.53-9.53,9.53h-37.48c-5.26,0-9.53-4.27-9.53-9.53v-37.48c0-5.26-4.27-9.53-9.53-9.53h-65.75c-5.26,0-9.53,4.27-9.53,9.53v37.48c0,5.26-4.27,9.53-9.53,9.53h-37.48c-5.26,0-9.53-4.27-9.53-9.53v-141.13c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-18.64c0-5.26,4.27-9.53,9.53-9.53h122.29c5.26,0,9.53,4.27,9.53,9.53v18.64c0,5.26,4.27,9.53,9.53,9.53ZM2019.6,275.83v-65.75c0-5.26-4.27-9.53-9.53-9.53h-65.75c-5.26,0-9.53,4.27-9.53,9.53v65.75c0,5.26,4.27,9.53,9.53,9.53h65.75c5.26,0,9.53-4.27,9.53-9.53ZM1840.47,172.28h-150.55c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53,4.27,9.53,9.53v150.55c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-150.55c0-5.26,4.27-9.53,9.53-9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53ZM1605.11,228.82h37.48c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-122.29c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v37.48c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h94.02c5.26,0,9.53,4.27,9.53,9.53v37.48c0,5.26-4.27,9.53-9.53,9.53h-65.75c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-37.48c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h122.29c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-37.48c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-94.02c-5.26,0-9.53-4.27-9.53-9.53v-37.48c0-5.26,4.27-9.53,9.53-9.53h65.75c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53ZM1397.71,360.63v-178.82c0-5.26-4.27-9.53-9.53-9.53h-37.48c-5.26,0-9.53,4.27-9.53,9.53v178.82c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53ZM1265.89,228.82h9.21c5.26,0,9.53,4.27,9.53,9.53v65.75c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-122.29c-5.26,0-9.53-4.27-9.53-9.53v-178.82c0-5.26,4.27-9.53,9.53-9.53h122.29c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53ZM1209.36,313.62h15.5c5.26,0,9.53-4.27,9.53-9.53v-65.75c0-5.26-4.27-9.53-9.53-9.53h-15.5c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-37.48c-5.26,0-9.53,4.27-9.53,9.53v122.29c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53Z"/>
</g>
<path class="cls-3" d="M1510.79,699.84v-9.21c0-5.26-4.27-9.53-9.53-9.53h-122.3c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v122.3c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h122.3c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-122.3c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53ZM1473,850.73h-65.77c-5.26,0-9.53-4.27-9.53-9.53v-122.3c0-5.26,4.27-9.53,9.53-9.53h65.77c5.26,0,9.53,4.27,9.53,9.53v122.3c0,5.26-4.27,9.53-9.53,9.53ZM1793.46,756.37v-37.47c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-150.56c-5.26,0-9.53,4.27-9.53,9.53v178.83c0,5.26,4.27,9.53,9.53,9.53h37.48c5.26,0,9.53-4.27,9.53-9.53v-65.77c0-5.26,4.27-9.53,9.53-9.53h65.74c5.26,0,9.53,4.27,9.53,9.53v65.77c0,5.26,4.27,9.53,9.53,9.53h37.51c5.26,0,9.53-4.27,9.53-9.53v-65.77c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53ZM1727.37,765.9h-65.74c-5.26,0-9.53-4.27-9.53-9.53v-37.47c0-5.26,4.27-9.53,9.53-9.53h65.74c5.26,0,9.53,4.27,9.53,9.53v37.47c0,5.26-4.27,9.53-9.53,9.53ZM1284.64,728.11v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-122.3c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v122.3c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h122.3c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-37.47c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-65.77c-5.26,0-9.53-4.27-9.53-9.53v-122.3c0-5.26,4.27-9.53,9.53-9.53h65.77c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h37.47c5.26,0,9.53-4.27,9.53-9.53ZM2010.09,709.37h-94.03c-5.26,0-9.53,4.27-9.53,9.53v37.47c0,5.26,4.27,9.53,9.53,9.53h65.74c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-65.74c-5.26,0-9.53,4.27-9.53,9.53v37.51c0,5.26,4.27,9.53,9.53,9.53h94.03c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-150.57c-5.26,0-9.53-4.27-9.53-9.53v-178.82c0-5.26,4.27-9.53,9.53-9.53h47.01s103.56,0,103.56,0c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53Z"/>
</g>
<g>
<path id="Outline" d="M488.21,1012.7l382.54-220.96c17.82-10.29,28.8-29.31,28.8-49.9v-446.69c0-27.45-14.64-52.81-38.41-66.53L478.59,7.72c-17.83-10.3-39.8-10.3-57.63,0L38.41,228.62C14.64,242.35,0,267.71,0,295.15v446.64c0,20.58,10.98,39.6,28.8,49.89l382.55,221.01c23.78,13.74,53.08,13.74,76.86,0Z"/>
<g>
<path class="cls-2" d="M678.66,659.16v175.44c0,12.32,13.34,20.02,24.01,13.86l152.06-87.75c7.93-4.57,12.81-13.03,12.81-22.18v-175.46c0-12.32-13.34-20.02-24.01-13.86l-152.06,87.78c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path id="_x3C_Path_x3E_" class="cls-1" d="M464.18,534.03v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.03,12.8-22.18v-44.44c0-14.79-16.01-24.03-28.81-16.63l-38.41,22.18c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_" class="cls-3" d="M289.27,403.13l39.04,22.54c7.92,4.57,17.69,4.57,25.61,0l39.04-22.54c12.8-7.39,12.8-25.88,0-33.27l-39.04-22.54c-7.92-4.57-17.69-4.57-25.61,0l-39.04,22.54c-12.8,7.39-12.8,25.88,0,33.27Z"/>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-1" d="M387.68,459.95l48.64,28.08c7.92,4.57,17.69,4.57,25.61,0l48.64-28.08c8.54-4.93,8.54-17.25,0-22.18l-48.64-28.08c-7.92-4.57-17.69-4.57-25.61,0l-48.64,28.08c-8.54,4.93-8.54,17.25,0,22.18Z"/>
</g>
<path id="Left__x3C_Path_x3E_" class="cls-3" d="M368.15,697.7l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-44.46c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.46c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path class="cls-2" d="M44.82,760.13l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
<path class="cls-2" d="M262.5,885.81l144.06,83.15c12.8,7.39,28.81-1.85,28.81-16.64v-168.73c0-9.15-4.88-17.6-12.8-22.18l-144.06-83.18c-12.8-7.39-28.81,1.85-28.81,16.63v168.76c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-1" d="M368.14,572.91l38.42,22.19c12.8,7.4,28.81-1.84,28.81-16.63v-44.45c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.43c0,9.15,4.88,17.6,12.8,22.18Z"/>
<path class="cls-3" d="M262.5,636.72l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-169.22c0-9.15-4.88-17.6-12.8-22.18l-38.42-22.19c-12.8-7.4-28.81,1.84-28.81,16.63v169.23c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-3" d="M569.82,473.04v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.02,12.8-22.17l.02-44.45c0-14.79-16-24.04-28.81-16.64l-38.43,22.19c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-3" d="M397.94,340.39l147.05,84.9c7.92,4.57,17.69,4.57,25.61,0l38.38-22.16c12.8-7.39,12.8-25.88,0-33.27l-147.05-84.9c-7.92-4.57-17.69-4.57-25.61,0l-38.38,22.16c-12.8,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-2" d="M289.91,153.31l146.42,84.5c7.92,4.57,17.68,4.57,25.61,0l146.4-84.53c12.8-7.39,12.8-25.87,0-33.27l-146.39-84.52c-7.92-4.58-17.69-4.58-25.61,0l-146.42,84.55c-12.81,7.39-12.8,25.88,0,33.27Z"/>
<path class="cls-2" d="M506.01,278l147.01,84.91c7.92,4.58,17.69,4.58,25.61,0l146.39-84.52c12.8-7.39,12.8-25.87,0-33.27l-147.03-84.91c-7.92-4.58-17.69-4.58-25.61,0l-146.37,84.52c-12.8,7.39-12.8,25.87,0,33.27Z"/>
<path class="cls-2" d="M678.66,410.2v169.21c0,14.78,16,24.03,28.81,16.64l147.26-84.98c7.93-4.57,12.81-13.03,12.81-22.18v-169.24c0-14.79-16.01-24.03-28.81-16.63l-147.26,85.01c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-2" d="M464.18,782.84v169.9c0,14.77,15.98,24.02,28.79,16.65l144.08-82.94c7.94-4.57,12.83-13.03,12.83-22.2v-169.9c0-14.77-15.98-24.02-28.79-16.65l-144.08,82.94c-7.94,4.57-12.83,13.03-12.83,22.2Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-3" d="M464.18,658.77v44.46c0,14.79,16,24.03,28.81,16.64l144.06-83.15c7.92-4.57,12.81-13.03,12.81-22.18v-44.46c0-14.79-16-24.03-28.81-16.64l-144.06,83.15c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-2" d="M73.24,278.38l146.39,84.52c7.93,4.58,17.69,4.58,25.61,0l147.01-84.91c12.8-7.39,12.8-25.88,0-33.27l-146.36-84.5c-7.92-4.57-17.68-4.57-25.61,0l-147.03,84.88c-12.81,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-2" d="M44.82,511.04l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 899.55 1023">
<defs>
<style>
.cls-1 {
fill: #fff;
}
.cls-2 {
fill: #e8c58e;
}
.cls-3 {
fill: #3083d6;
}
.cls-4 {
fill: #3eaf3e;
}
</style>
</defs>
<g id="Layer_16">
<g>
<path id="Outline" d="M488.21,1012.7l382.54-220.96c17.82-10.29,28.8-29.31,28.8-49.9v-446.69c0-27.45-14.64-52.81-38.41-66.53L478.59,7.72c-17.83-10.3-39.8-10.3-57.63,0L38.41,228.62C14.64,242.35,0,267.71,0,295.15v446.64c0,20.58,10.98,39.6,28.8,49.89l382.55,221.01c23.78,13.74,53.08,13.74,76.86,0Z"/>
<g>
<path class="cls-4" d="M678.66,659.16v175.44c0,12.32,13.34,20.02,24.01,13.86l152.06-87.75c7.93-4.57,12.81-13.03,12.81-22.18v-175.46c0-12.32-13.34-20.02-24.01-13.86l-152.06,87.78c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path id="_x3C_Path_x3E_" class="cls-1" d="M464.18,534.03v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.03,12.8-22.18v-44.44c0-14.79-16.01-24.03-28.81-16.63l-38.41,22.18c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_" class="cls-3" d="M289.27,403.13l39.04,22.54c7.92,4.57,17.69,4.57,25.61,0l39.04-22.54c12.8-7.39,12.8-25.88,0-33.27l-39.04-22.54c-7.92-4.57-17.69-4.57-25.61,0l-39.04,22.54c-12.8,7.39-12.8,25.88,0,33.27Z"/>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-1" d="M387.68,459.95l48.64,28.08c7.92,4.57,17.69,4.57,25.61,0l48.64-28.08c8.54-4.93,8.54-17.25,0-22.18l-48.64-28.08c-7.92-4.57-17.69-4.57-25.61,0l-48.64,28.08c-8.54,4.93-8.54,17.25,0,22.18Z"/>
</g>
<path id="Left__x3C_Path_x3E_" class="cls-2" d="M368.15,697.7l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-44.46c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.46c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path class="cls-2" d="M44.82,760.13l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
<path class="cls-2" d="M262.5,885.81l144.06,83.15c12.8,7.39,28.81-1.85,28.81-16.64v-168.73c0-9.15-4.88-17.6-12.8-22.18l-144.06-83.18c-12.8-7.39-28.81,1.85-28.81,16.63v168.76c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-1" d="M368.14,572.91l38.42,22.19c12.8,7.4,28.81-1.84,28.81-16.63v-44.45c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.43c0,9.15,4.88,17.6,12.8,22.18Z"/>
<path class="cls-3" d="M262.5,636.72l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-169.22c0-9.15-4.88-17.6-12.8-22.18l-38.42-22.19c-12.8-7.4-28.81,1.84-28.81,16.63v169.23c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-3" d="M569.82,473.04v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.02,12.8-22.17l.02-44.45c0-14.79-16-24.04-28.81-16.64l-38.43,22.19c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-3" d="M397.94,340.39l147.05,84.9c7.92,4.57,17.69,4.57,25.61,0l38.38-22.16c12.8-7.39,12.8-25.88,0-33.27l-147.05-84.9c-7.92-4.57-17.69-4.57-25.61,0l-38.38,22.16c-12.8,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-3" d="M289.91,153.31l146.42,84.5c7.92,4.57,17.68,4.57,25.61,0l146.4-84.53c12.8-7.39,12.8-25.87,0-33.27l-146.39-84.52c-7.92-4.58-17.69-4.58-25.61,0l-146.42,84.55c-12.81,7.39-12.8,25.88,0,33.27Z"/>
<path class="cls-3" d="M506.01,278l147.01,84.91c7.92,4.58,17.69,4.58,25.61,0l146.39-84.52c12.8-7.39,12.8-25.87,0-33.27l-147.03-84.91c-7.92-4.58-17.69-4.58-25.61,0l-146.37,84.52c-12.8,7.39-12.8,25.87,0,33.27Z"/>
<path class="cls-4" d="M678.66,410.2v169.21c0,14.78,16,24.03,28.81,16.64l147.26-84.98c7.93-4.57,12.81-13.03,12.81-22.18v-169.24c0-14.79-16.01-24.03-28.81-16.63l-147.26,85.01c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-4" d="M464.18,782.84v169.9c0,14.77,15.98,24.02,28.79,16.65l144.08-82.94c7.94-4.57,12.83-13.03,12.83-22.2v-169.9c0-14.77-15.98-24.02-28.79-16.65l-144.08,82.94c-7.94,4.57-12.83,13.03-12.83,22.2Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-4" d="M464.18,658.77v44.46c0,14.79,16,24.03,28.81,16.64l144.06-83.15c7.92-4.57,12.81-13.03,12.81-22.18v-44.46c0-14.79-16-24.03-28.81-16.64l-144.06,83.15c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-3" d="M73.24,278.38l146.39,84.52c7.93,4.58,17.69,4.58,25.61,0l147.01-84.91c12.8-7.39,12.8-25.88,0-33.27l-146.36-84.5c-7.92-4.57-17.68-4.57-25.61,0l-147.03,84.88c-12.81,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-3" d="M44.82,511.04l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 899.55 1023">
<defs>
<style>
.cls-1 {
fill: #8c6cdc;
}
.cls-2 {
fill: #fff;
}
.cls-3 {
fill: #eae0b0;
}
</style>
</defs>
<g id="Layer_11">
<g>
<path id="Outline" d="M488.21,1012.7l382.54-220.96c17.82-10.29,28.8-29.31,28.8-49.9v-446.69c0-27.45-14.64-52.81-38.41-66.53L478.59,7.72c-17.83-10.3-39.8-10.3-57.63,0L38.41,228.62C14.64,242.35,0,267.71,0,295.15v446.64c0,20.58,10.98,39.6,28.8,49.89l382.55,221.01c23.78,13.74,53.08,13.74,76.86,0Z"/>
<path class="cls-1" d="M678.66,659.16v175.44c0,12.32,13.34,20.02,24.01,13.86l152.06-87.75c7.93-4.57,12.81-13.03,12.81-22.18v-175.46c0-12.32-13.34-20.02-24.01-13.86l-152.06,87.78c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-1" d="M44.82,760.13l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
<path class="cls-1" d="M262.5,885.81l144.06,83.15c12.8,7.39,28.81-1.85,28.81-16.64v-168.73c0-9.15-4.88-17.6-12.8-22.18l-144.06-83.18c-12.8-7.39-28.81,1.85-28.81,16.63v168.76c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_" class="cls-2" d="M396.92,590.66l39.04,22.54c7.92,4.57,17.69,4.57,25.61,0l39.04-22.54c12.8-7.39,12.8-25.88,0-33.27l-39.04-22.54c-7.92-4.57-17.69-4.57-25.61,0l-39.04,22.54c-12.8,7.39-12.8,25.88,0,33.27Z"/>
<path id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_" class="cls-3" d="M495.33,647.47l48.64,28.08c7.92,4.57,17.69,4.57,25.61,0l48.64-28.08c8.54-4.93,8.54-17.25,0-22.18l-48.64-28.08c-7.92-4.57-17.69-4.57-25.61,0l-48.64,28.08c-8.54,4.93-8.54,17.25,0,22.18Z"/>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-3" d="M289.93,652.53l147.05,84.9c7.92,4.57,17.69,4.57,25.61,0l38.38-22.16c12.8-7.39,12.8-25.88,0-33.27l-147.05-84.9c-7.92-4.57-17.69-4.57-25.61,0l-38.38,22.16c-12.8,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-1" d="M289.91,153.31l146.42,84.5c7.92,4.57,17.68,4.57,25.61,0l146.4-84.53c12.8-7.39,12.8-25.87,0-33.27l-146.39-84.52c-7.92-4.58-17.69-4.58-25.61,0l-146.42,84.55c-12.81,7.39-12.8,25.88,0,33.27Z"/>
<path class="cls-1" d="M506.01,278l147.01,84.91c7.92,4.58,17.69,4.58,25.61,0l146.39-84.52c12.8-7.39,12.8-25.87,0-33.27l-147.03-84.91c-7.92-4.58-17.69-4.58-25.61,0l-146.37,84.52c-12.8,7.39-12.8,25.87,0,33.27Z"/>
<path class="cls-1" d="M678.66,410.2v169.21c0,14.78,16,24.03,28.81,16.64l147.26-84.98c7.93-4.57,12.81-13.03,12.81-22.18v-169.24c0-14.79-16.01-24.03-28.81-16.63l-147.26,85.01c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-1" d="M464.18,782.84v169.9c0,14.77,15.98,24.02,28.79,16.65l144.08-82.94c7.94-4.57,12.83-13.03,12.83-22.2v-169.9c0-14.77-15.98-24.02-28.79-16.65l-144.08,82.94c-7.94,4.57-12.83,13.03-12.83,22.2Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-3" d="M249.7,532.86v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.03,12.8-22.18v-44.44c0-14.79-16.01-24.03-28.81-16.63l-38.41,22.18c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-2" d="M355.34,471.87v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.02,12.8-22.17l.02-44.45c0-14.79-16-24.04-28.81-16.64l-38.43,22.19c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-3" d="M249.7,407.5v44.46c0,14.79,16,24.03,28.81,16.64l144.06-83.15c7.92-4.57,12.81-13.03,12.81-22.18v-44.46c0-14.79-16-24.03-28.81-16.64l-144.06,83.15c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-1" d="M73.24,278.38l146.39,84.52c7.93,4.58,17.69,4.58,25.61,0l147.01-84.91c12.8-7.39,12.8-25.88,0-33.27l-146.36-84.5c-7.92-4.57-17.68-4.57-25.61,0l-147.03,84.88c-12.81,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-1" d="M44.82,511.04l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
<path id="Left__x3C_Path_x3E_" class="cls-2" d="M477.06,510.97l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-44.46c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.46c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-3" d="M477.06,386.18l38.42,22.19c12.8,7.4,28.81-1.84,28.81-16.63v-44.45c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.43c0,9.15,4.88,17.6,12.8,22.18Z"/>
<path class="cls-3" d="M582.63,571.92l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-169.22c0-9.15-4.88-17.6-12.8-22.18l-38.42-22.19c-12.8-7.4-28.81,1.84-28.81,16.63v169.23c0,9.15,4.88,17.61,12.81,22.18Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2975.95 1023">
<defs>
<style>
.cls-1 {
fill: #8c6cdc;
}
.cls-2 {
fill: #fff;
}
.cls-3 {
fill: #eae0b0;
}
</style>
</defs>
<g id="Layer_11">
<g>
<path d="M2966.43,459.72h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-169.3c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-84.47c-5.26,0-9.53,4.27-9.53,9.53v9.21c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.24c-5.26,0-9.53-4.27-9.53-9.53v-131.82c0-5.26,4.27-9.53,9.53-9.53h37.51c5.26,0,9.53-4.27,9.53-9.53v-59.36c0-5.26-4.27-9.53-9.53-9.53h-9.21c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-282.39c-5.26,0-9.53,4.27-9.53,9.53v12.35c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-84.47c-5.26,0-9.53,4.27-9.53,9.53v12.35c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-593.33c-5.26,0-9.53,4.27-9.53,9.53v12.35c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-84.48c-5.26,0-9.53,4.27-9.53,9.53v40.62c0,5.26-4.27,9.53-9.53,9.53h-18.74c-5.26,0-9.53-4.27-9.53-9.53v-9.21c0-5.26-4.27-9.53-9.53-9.53h-9.24c-5.26,0-9.53-4.27-9.53-9.53v-12.35c0-5.26-4.27-9.53-9.53-9.53h-172.35c-5.26,0-9.53,4.27-9.53,9.53v228.94c0,5.26,4.27,9.53,9.53,9.53h1.16c5.26,0,9.53,4.27,9.53,9.53h0c0,5.26-4.27,9.53-9.53,9.53h-1.16c-5.26,0-9.53,4.27-9.53,9.53v216.3c0,5.26,4.27,9.53,9.53,9.53h1.16c5.26,0,9.53,4.26,9.53,9.52h0c0,5.26-4.26,9.53-9.53,9.53h-1.16c-5.26,0-9.53,4.27-9.53,9.53v230.79c0,5.26,4.27,9.53,9.53,9.53h7.51c5.26,0,9.53,4.27,9.53,9.53v9.54c0,5.26,4.27,9.53,9.53,9.53h89.23c5.26,0,9.53-4.27,9.53-9.53v-38.11c0-5.26,4.27-9.53,9.53-9.53h75.91c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h19.06c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h202.68c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.26-9.53,9.53-9.53h21.06c5.26,0,9.53,4.26,9.53,9.52v9.54c0,5.26,4.27,9.53,9.53,9.53h181.45c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.52c0,5.26,4.27,9.53,9.53,9.53l418.75-.23c5.26,0,9.52-4.27,9.52-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.55c0,5.25,4.25,9.51,9.5,9.53l65.93.19c5.27.02,9.55-4.25,9.55-9.53v-235.58c0-5.26,4.27-9.53,9.53-9.53h180.38c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h82.57c5.26,0,9.53-4.27,9.53-9.53v-9.53c0-5.26,4.27-9.53,9.53-9.53h22.23c5.26,0,9.53,4.27,9.53,9.53v9.53c0,5.26,4.27,9.53,9.53,9.53h149.18c5.26,0,9.53-4.27,9.53-9.53v-8.86c0-5.26,4.27-9.53,9.53-9.53h9.21c5.26,0,9.53-4.27,9.53-9.53v-181.04c0-5.26-4.27-9.53-9.53-9.53Z"/>
<path id="Horizons" class="cls-1" d="M2867.64,473.86v-9.53c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h94.34c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h37.8c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37v-37.8c0-5.17-4.19-9.37-9.37-9.37h-94.34c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-37.8c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37ZM2660.4,426.7h-37.8c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-94.34c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-179.14c0-5.17-4.19-9.37-9.37-9.37ZM2396.46,454.96h9.53c5.17,0,9.37,4.19,9.37,9.37v122.6c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-122.6c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37ZM2283.38,596.3h66.07c5.17,0,9.37-4.19,9.37-9.37v-122.6c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v122.6c0,5.17,4.19,9.37,9.37,9.37ZM2151.58,426.7h-179.14c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h94.34c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h179.14c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-94.34c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-37.8c0-5.17-4.19-9.37-9.37-9.37ZM1906.53,615.2v-179.14c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37ZM1784.09,511.5h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-66.07c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-179.14c0-5.17,4.19-9.37,9.37-9.37h150.87c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17-4.19,9.37-9.37,9.37ZM1736.92,502.13v-37.8c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37ZM1520.15,454.96h9.53c5.17,0,9.37,4.19,9.37,9.37v122.6c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-122.6c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37ZM1482.51,586.94v-122.6c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v122.6c0,5.17,4.19,9.37,9.37,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37ZM1275.27,426.7h-37.8c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-66.07c-5.17,0-9.37-4.19-9.37-9.37v-66.07c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-66.07c0-5.17,4.19-9.37,9.37-9.37h66.07c5.17,0,9.37,4.19,9.37,9.37v66.07c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-179.14c0-5.17-4.19-9.37-9.37-9.37Z"/>
<g id="Distant">
<path class="cls-2" d="M2528.43,181.65v9.53c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v150.87c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-150.87c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h150.87c5.17,0,9.37,4.19,9.37,9.37ZM2321.18,172.28h-37.8c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-94.34c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-179.14c0-5.17-4.19-9.37-9.37-9.37ZM2057.24,209.97h9.53c5.17,0,9.37,4.19,9.37,9.37v141.45c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-37.8c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-141.45c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-18.95c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v18.95c0,5.17,4.19,9.37,9.37,9.37ZM2019.6,275.99v-66.07c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17,4.19,9.37,9.37,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37ZM1840.63,172.28h-150.87c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37,4.19,9.37,9.37v150.87c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-150.87c0-5.17,4.19-9.37,9.37-9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37ZM1604.95,228.82h37.8c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-122.6c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h94.34c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17-4.19,9.37-9.37,9.37h-66.07c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h122.6c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-37.8c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-94.34c-5.17,0-9.37-4.19-9.37-9.37v-37.8c0-5.17,4.19-9.37,9.37-9.37h66.07c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37ZM1397.71,360.79v-179.14c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37ZM1265.74,228.82h9.53c5.17,0,9.37,4.19,9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-179.14c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37ZM1209.2,313.62h15.81c5.17,0,9.37-4.19,9.37-9.37v-66.07c0-5.17-4.19-9.37-9.37-9.37h-15.81c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v122.6c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37Z"/>
</g>
<g>
<path id="N" class="cls-3" d="M2334.7,681.11h-37.8c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-94.34c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-179.14c0-5.17-4.19-9.37-9.37-9.37Z"/>
<g id="O_2">
<path class="cls-3" d="M1385,709.37v-18.89c0-5.17-4.19-9.37-9.36-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h150.88c5.17,0,9.37-4.19,9.37-9.36v-9.53c0-5.17-4.19-9.37-9.37-9.37h-94.35c-5.17,0-9.37-4.19-9.37-9.37v-131.99Z"/>
</g>
<rect id="I" class="cls-3" x="1962.45" y="751.78" width="197.88" height="56.54" rx="9.37" ry="9.37" transform="translate(2841.43 -1281.34) rotate(90)"/>
<g id="R">
<path class="cls-3" d="M1256.37,700v-9.53c0-5.17-4.19-9.37-9.37-9.37h-150.88c-5.17,0-9.37,4.19-9.37,9.37v179.15c0,5.17,4.19,9.37,9.37,9.37h37.79c5.17,0,9.37-4.19,9.37-9.37v-66.09c0-5.17,4.19-9.37,9.37-9.37h94.35c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-37.79c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37ZM1218.74,765.9h-66.09c-5.17,0-9.37-4.19-9.37-9.37v-37.79c0-5.17,4.19-9.37,9.37-9.37h66.09c5.17,0,9.37,4.19,9.37,9.37v37.79c0,5.17-4.19,9.37-9.37,9.37Z"/>
</g>
<g id="O_1">
<path class="cls-3" d="M1736.28,690.48v150.87c0,5.17-4.19,9.37-9.36,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-150.87c.01-5.17,4.21-9.37,9.38-9.37h37.79c5.17,0,9.37,4.2,9.37,9.37v150.87c0,5.17,4.19,9.37,9.36,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37v-150.87c0-5.17,4.19-9.37,9.37-9.37h37.79c5.17,0,9.37,4.19,9.37,9.37Z"/>
</g>
<g id="O_2-2" data-name="O_2">
<path class="cls-3" d="M1925.45,765.91h-18.91c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.54c5.17,0,9.37,4.19,9.37,9.37v37.81c0,5.17-4.19,9.37-9.37,9.37h-66.06c-5.17,0-9.37-4.19-9.37-9.37v-122.62c0-5.17,4.19-9.37,9.37-9.37h66.06c5.17,0,9.37,4.19,9.37,9.37v9.54c0,5.17,4.19,9.37,9.37,9.37h37.8c5.18,0,9.37-4.2,9.37-9.37v-9.54c0-5.17-4.2-9.36-9.37-9.36h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-122.59c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v122.62c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h94.32c5.17,0,9.37-4.19,9.37-9.37v-3.18c0-5.17,4.19-9.37,9.37-9.37h9.53c5.18,0,9.37,4.2,9.37,9.37v3.17c0,5.18,4.19,9.37,9.37,9.37h9.54c5.17,0,9.37-4.19,9.37-9.37v-94.34c0-5.17-4.19-9.37-9.37-9.37h-47.18Z"/>
</g>
</g>
</g>
<g>
<path id="Outline" d="M488.21,1012.7l382.54-220.96c17.82-10.29,28.8-29.31,28.8-49.9v-446.69c0-27.45-14.64-52.81-38.41-66.53L478.59,7.72c-17.83-10.3-39.8-10.3-57.63,0L38.41,228.62C14.64,242.35,0,267.71,0,295.15v446.64c0,20.58,10.98,39.6,28.8,49.89l382.55,221.01c23.78,13.74,53.08,13.74,76.86,0Z"/>
<path class="cls-1" d="M678.66,659.16v175.44c0,12.32,13.34,20.02,24.01,13.86l152.06-87.75c7.93-4.57,12.81-13.03,12.81-22.18v-175.46c0-12.32-13.34-20.02-24.01-13.86l-152.06,87.78c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-1" d="M44.82,760.13l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
<path class="cls-1" d="M262.5,885.81l144.06,83.15c12.8,7.39,28.81-1.85,28.81-16.64v-168.73c0-9.15-4.88-17.6-12.8-22.18l-144.06-83.18c-12.8-7.39-28.81,1.85-28.81,16.63v168.76c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_" class="cls-2" d="M396.92,590.66l39.04,22.54c7.92,4.57,17.69,4.57,25.61,0l39.04-22.54c12.8-7.39,12.8-25.88,0-33.27l-39.04-22.54c-7.92-4.57-17.69-4.57-25.61,0l-39.04,22.54c-12.8,7.39-12.8,25.88,0,33.27Z"/>
<path id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_" class="cls-3" d="M495.33,647.47l48.64,28.08c7.92,4.57,17.69,4.57,25.61,0l48.64-28.08c8.54-4.93,8.54-17.25,0-22.18l-48.64-28.08c-7.92-4.57-17.69-4.57-25.61,0l-48.64,28.08c-8.54,4.93-8.54,17.25,0,22.18Z"/>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-3" d="M289.93,652.53l147.05,84.9c7.92,4.57,17.69,4.57,25.61,0l38.38-22.16c12.8-7.39,12.8-25.88,0-33.27l-147.05-84.9c-7.92-4.57-17.69-4.57-25.61,0l-38.38,22.16c-12.8,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-1" d="M289.91,153.31l146.42,84.5c7.92,4.57,17.68,4.57,25.61,0l146.4-84.53c12.8-7.39,12.8-25.87,0-33.27l-146.39-84.52c-7.92-4.58-17.69-4.58-25.61,0l-146.42,84.55c-12.81,7.39-12.8,25.88,0,33.27Z"/>
<path class="cls-1" d="M506.01,278l147.01,84.91c7.92,4.58,17.69,4.58,25.61,0l146.39-84.52c12.8-7.39,12.8-25.87,0-33.27l-147.03-84.91c-7.92-4.58-17.69-4.58-25.61,0l-146.37,84.52c-12.8,7.39-12.8,25.87,0,33.27Z"/>
<path class="cls-1" d="M678.66,410.2v169.21c0,14.78,16,24.03,28.81,16.64l147.26-84.98c7.93-4.57,12.81-13.03,12.81-22.18v-169.24c0-14.79-16.01-24.03-28.81-16.63l-147.26,85.01c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-1" d="M464.18,782.84v169.9c0,14.77,15.98,24.02,28.79,16.65l144.08-82.94c7.94-4.57,12.83-13.03,12.83-22.2v-169.9c0-14.77-15.98-24.02-28.79-16.65l-144.08,82.94c-7.94,4.57-12.83,13.03-12.83,22.2Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-3" d="M249.7,532.86v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.03,12.8-22.18v-44.44c0-14.79-16.01-24.03-28.81-16.63l-38.41,22.18c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-2" d="M355.34,471.87v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.02,12.8-22.17l.02-44.45c0-14.79-16-24.04-28.81-16.64l-38.43,22.19c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-3" d="M249.7,407.5v44.46c0,14.79,16,24.03,28.81,16.64l144.06-83.15c7.92-4.57,12.81-13.03,12.81-22.18v-44.46c0-14.79-16-24.03-28.81-16.64l-144.06,83.15c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-1" d="M73.24,278.38l146.39,84.52c7.93,4.58,17.69,4.58,25.61,0l147.01-84.91c12.8-7.39,12.8-25.88,0-33.27l-146.36-84.5c-7.92-4.57-17.68-4.57-25.61,0l-147.03,84.88c-12.81,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-1" d="M44.82,511.04l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
<path id="Left__x3C_Path_x3E_" class="cls-2" d="M477.06,510.97l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-44.46c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.46c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-3" d="M477.06,386.18l38.42,22.19c12.8,7.4,28.81-1.84,28.81-16.63v-44.45c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.43c0,9.15,4.88,17.6,12.8,22.18Z"/>
<path class="cls-3" d="M582.63,571.92l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-169.22c0-9.15-4.88-17.6-12.8-22.18l-38.42-22.19c-12.8-7.4-28.81,1.84-28.81,16.63v169.23c0,9.15,4.88,17.61,12.81,22.18Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 903.26 1023">
<defs>
<style>
.cls-1 {
fill: #fff;
}
</style>
</defs>
<g id="Layer_18">
<g>
<g>
<path id="Outline" d="M488.91,997.61l371.02-214.31c17.29-9.98,27.93-28.43,27.93-48.39v-433.24c0-26.62-14.2-51.22-37.25-64.53L479.58,22.89c-17.29-9.99-38.6-9.99-55.89,0L52.65,237.14c-23.05,13.31-37.25,37.91-37.25,64.53v433.19c0,19.96,10.65,38.41,27.93,48.39l371.03,214.36c23.06,13.32,51.48,13.33,74.55,0Z"/>
<path id="Outline-2" data-name="Outline" class="cls-1" d="M451.63,15.4c9.65,0,19.3,2.5,27.95,7.49l371.03,214.25c23.05,13.31,37.25,37.91,37.25,64.53v433.24c0,19.96-10.65,38.41-27.93,48.39l-371.02,214.31c-11.53,6.66-24.4,9.99-37.27,9.99s-25.75-3.33-37.28-9.99L43.33,783.25c-17.28-9.99-27.93-28.43-27.93-48.39v-433.19c0-26.62,14.2-51.22,37.25-64.53L423.68,22.89c8.65-4.99,18.3-7.49,27.95-7.49M451.63,0c-12.5,0-24.82,3.3-35.65,9.55L44.95,223.8C17.23,239.81,0,269.65,0,301.67v433.19c0,25.38,13.65,49.03,35.63,61.73l371.03,214.36c13.66,7.89,29.21,12.06,44.98,12.06s31.32-4.17,44.97-12.06l371.02-214.31c21.98-12.7,35.63-36.35,35.63-61.73v-433.24c0-32.02-17.23-61.86-44.95-77.87L487.28,9.55c-10.82-6.25-23.15-9.55-35.65-9.55h0Z"/>
</g>
<g>
<path class="cls-1" d="M673.63,654.71v170.15c0,11.95,12.93,19.42,23.28,13.45l147.48-85.11c7.69-4.44,12.42-12.64,12.42-21.51v-170.18c0-11.95-12.94-19.42-23.29-13.44l-147.48,85.14c-7.69,4.44-12.42,12.64-12.42,21.51Z"/>
<path id="_x3C_Path_x3E_" class="cls-1" d="M465.6,533.35v43.11c0,14.34,15.52,23.3,27.94,16.13l37.26-21.51c7.69-4.44,12.42-12.64,12.42-21.51v-43.11c0-14.34-15.52-23.3-27.94-16.13l-37.26,21.51c-7.69,4.44-12.42,12.64-12.42,21.51Z"/>
<path id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_" class="cls-1" d="M295.96,406.39l37.86,21.86c7.69,4.44,17.15,4.44,24.84,0l37.86-21.86c12.42-7.17,12.42-25.1,0-32.27l-37.86-21.86c-7.69-4.44-17.15-4.44-24.84,0l-37.86,21.86c-12.42,7.17-12.42,25.1,0,32.27Z"/>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-1" d="M391.41,461.5l47.18,27.24c7.69,4.44,17.15,4.44,24.84,0l47.18-27.24c8.28-4.78,8.28-16.73,0-21.51l-47.18-27.24c-7.69-4.44-17.15-4.44-24.84,0l-47.18,27.24c-8.28,4.78-8.28,16.73,0,21.51Z"/>
</g>
<path id="Left__x3C_Path_x3E_" class="cls-1" d="M372.46,692.09l37.26,21.5c12.42,7.17,27.94-1.8,27.94-16.13v-43.12c0-8.88-4.74-17.08-12.42-21.51l-37.26-21.5c-12.42-7.17-27.94,1.8-27.94,16.13v43.12c0,8.88,4.74,17.08,12.42,21.51Z"/>
<path class="cls-1" d="M58.87,752.64l142.82,82.45c12.42,7.17,27.94-1.79,27.94-16.13v-163.65c0-8.87-4.73-17.07-12.42-21.51l-142.82-82.45c-12.42-7.17-27.94,1.79-27.94,16.13v163.65c0,8.87,4.73,17.07,12.42,21.51Z"/>
<path class="cls-1" d="M270,874.54l139.72,80.65c12.42,7.17,27.94-1.79,27.94-16.13v-163.65c0-8.87-4.73-17.07-12.42-21.51l-139.72-80.67c-12.42-7.17-27.94,1.79-27.94,16.13v163.68c0,8.87,4.74,17.08,12.42,21.51Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-1" d="M372.45,571.06l37.26,21.52c12.42,7.17,27.95-1.79,27.95-16.13v-43.11c0-8.88-4.74-17.08-12.42-21.51l-37.26-21.5c-12.42-7.17-27.94,1.8-27.94,16.13v43.09c0,8.87,4.73,17.07,12.41,21.51Z"/>
<path class="cls-1" d="M270,632.95l37.26,21.5c12.42,7.17,27.94-1.8,27.94-16.13v-164.12c0-8.87-4.73-17.07-12.42-21.51l-37.26-21.52c-12.42-7.17-27.95,1.79-27.95,16.13v164.14c0,8.88,4.74,17.08,12.42,21.51Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-1" d="M568.06,474.2v43.1c0,14.34,15.52,23.3,27.94,16.13l37.26-21.51c7.68-4.43,12.42-12.63,12.42-21.5l.02-43.11c0-14.34-15.52-23.31-27.94-16.14l-37.28,21.52c-7.69,4.44-12.42,12.64-12.42,21.51Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-1" d="M401.36,345.54l142.62,82.34c7.69,4.44,17.15,4.44,24.84,0l37.23-21.49c12.42-7.17,12.42-25.1,0-32.27l-142.62-82.34c-7.69-4.44-17.15-4.44-24.84,0l-37.23,21.49c-12.42,7.17-12.42,25.1,0,32.27Z"/>
<path class="cls-1" d="M296.58,164.09l142.01,81.95c7.68,4.43,17.15,4.43,24.84,0l141.99-81.98c12.42-7.17,12.42-25.1,0-32.27l-141.99-81.98c-7.69-4.44-17.16-4.44-24.84,0l-142.01,82.01c-12.42,7.17-12.42,25.1,0,32.27Z"/>
<path class="cls-1" d="M506.18,285.03l142.58,82.35c7.69,4.44,17.16,4.44,24.84,0l141.98-81.98c12.42-7.17,12.42-25.09,0-32.27l-142.61-82.35c-7.69-4.44-17.16-4.44-24.84,0l-141.96,81.98c-12.42,7.17-12.42,25.09,0,32.26Z"/>
<path class="cls-1" d="M673.63,413.25v164.12c0,14.34,15.52,23.3,27.94,16.14l142.82-82.42c7.69-4.44,12.42-12.64,12.42-21.51v-164.15c0-14.34-15.52-23.3-27.94-16.13l-142.82,82.45c-7.69,4.44-12.42,12.64-12.42,21.51Z"/>
<path class="cls-1" d="M465.6,774.67v164.78c0,14.33,15.5,23.29,27.92,16.15l139.74-80.44c7.7-4.43,12.45-12.64,12.45-21.53v-164.78c0-14.33-15.5-23.29-27.92-16.15l-139.74,80.44c-7.7,4.43-12.45,12.64-12.45,21.53Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-1" d="M465.6,654.34v43.12c0,14.34,15.52,23.3,27.94,16.13l139.72-80.65c7.69-4.44,12.42-12.64,12.42-21.51v-43.12c0-14.34-15.52-23.3-27.94-16.13l-139.72,80.65c-7.69,4.44-12.42,12.64-12.42,21.51Z"/>
<path class="cls-1" d="M86.44,285.4l141.98,81.98c7.69,4.44,17.16,4.44,24.84,0l142.58-82.35c12.42-7.17,12.42-25.1,0-32.27l-141.96-81.95c-7.68-4.44-17.15-4.44-24.84,0l-142.61,82.32c-12.42,7.17-12.42,25.1,0,32.27Z"/>
<path class="cls-1" d="M58.87,511.05l142.82,82.45c12.42,7.17,27.94-1.79,27.94-16.13v-163.65c0-8.87-4.73-17.07-12.42-21.51l-142.82-82.45c-12.42-7.17-27.94,1.79-27.94,16.13v163.65c0,8.87,4.73,17.07,12.42,21.51Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2975.95 1023">
<defs>
<style>
.cls-1 {
fill: #fff;
}
.cls-2 {
fill: #e8c58e;
}
.cls-3 {
fill: #3083d6;
}
.cls-4 {
fill: #3eaf3e;
}
</style>
</defs>
<g id="Layer_16">
<g>
<path id="Outline" d="M488.21,1012.7l382.54-220.96c17.82-10.29,28.8-29.31,28.8-49.9v-446.69c0-27.45-14.64-52.81-38.41-66.53L478.59,7.72c-17.83-10.3-39.8-10.3-57.63,0L38.41,228.62C14.64,242.35,0,267.71,0,295.15v446.64c0,20.58,10.98,39.6,28.8,49.89l382.55,221.01c23.78,13.74,53.08,13.74,76.86,0Z"/>
<g>
<path class="cls-4" d="M678.66,659.16v175.44c0,12.32,13.34,20.02,24.01,13.86l152.06-87.75c7.93-4.57,12.81-13.03,12.81-22.18v-175.46c0-12.32-13.34-20.02-24.01-13.86l-152.06,87.78c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path id="_x3C_Path_x3E_" class="cls-1" d="M464.18,534.03v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.03,12.8-22.18v-44.44c0-14.79-16.01-24.03-28.81-16.63l-38.41,22.18c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-2" data-name="_x3C_Path_x3E_" class="cls-3" d="M289.27,403.13l39.04,22.54c7.92,4.57,17.69,4.57,25.61,0l39.04-22.54c12.8-7.39,12.8-25.88,0-33.27l-39.04-22.54c-7.92-4.57-17.69-4.57-25.61,0l-39.04,22.54c-12.8,7.39-12.8,25.88,0,33.27Z"/>
<path id="_x3C_Path_x3E_-3" data-name="_x3C_Path_x3E_" class="cls-1" d="M387.68,459.95l48.64,28.08c7.92,4.57,17.69,4.57,25.61,0l48.64-28.08c8.54-4.93,8.54-17.25,0-22.18l-48.64-28.08c-7.92-4.57-17.69-4.57-25.61,0l-48.64,28.08c-8.54,4.93-8.54,17.25,0,22.18Z"/>
</g>
<path id="Left__x3C_Path_x3E_" class="cls-2" d="M368.15,697.7l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-44.46c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.46c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path class="cls-2" d="M44.82,760.13l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
<path class="cls-2" d="M262.5,885.81l144.06,83.15c12.8,7.39,28.81-1.85,28.81-16.64v-168.73c0-9.15-4.88-17.6-12.8-22.18l-144.06-83.18c-12.8-7.39-28.81,1.85-28.81,16.63v168.76c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-4" data-name="_x3C_Path_x3E_" class="cls-1" d="M368.14,572.91l38.42,22.19c12.8,7.4,28.81-1.84,28.81-16.63v-44.45c0-9.15-4.88-17.61-12.81-22.18l-38.41-22.17c-12.8-7.39-28.81,1.85-28.81,16.64v44.43c0,9.15,4.88,17.6,12.8,22.18Z"/>
<path class="cls-3" d="M262.5,636.72l38.41,22.17c12.8,7.39,28.81-1.85,28.81-16.64v-169.22c0-9.15-4.88-17.6-12.8-22.18l-38.42-22.19c-12.8-7.4-28.81,1.84-28.81,16.63v169.23c0,9.15,4.88,17.61,12.81,22.18Z"/>
<path id="_x3C_Path_x3E_-5" data-name="_x3C_Path_x3E_" class="cls-3" d="M569.82,473.04v44.44c0,14.79,16.01,24.03,28.81,16.63l38.41-22.18c7.92-4.57,12.8-13.02,12.8-22.17l.02-44.45c0-14.79-16-24.04-28.81-16.64l-38.43,22.19c-7.92,4.57-12.8,13.03-12.8,22.18Z"/>
<path id="_x3C_Path_x3E_-6" data-name="_x3C_Path_x3E_" class="cls-3" d="M397.94,340.39l147.05,84.9c7.92,4.57,17.69,4.57,25.61,0l38.38-22.16c12.8-7.39,12.8-25.88,0-33.27l-147.05-84.9c-7.92-4.57-17.69-4.57-25.61,0l-38.38,22.16c-12.8,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-3" d="M289.91,153.31l146.42,84.5c7.92,4.57,17.68,4.57,25.61,0l146.4-84.53c12.8-7.39,12.8-25.87,0-33.27l-146.39-84.52c-7.92-4.58-17.69-4.58-25.61,0l-146.42,84.55c-12.81,7.39-12.8,25.88,0,33.27Z"/>
<path class="cls-3" d="M506.01,278l147.01,84.91c7.92,4.58,17.69,4.58,25.61,0l146.39-84.52c12.8-7.39,12.8-25.87,0-33.27l-147.03-84.91c-7.92-4.58-17.69-4.58-25.61,0l-146.37,84.52c-12.8,7.39-12.8,25.87,0,33.27Z"/>
<path class="cls-4" d="M678.66,410.2v169.21c0,14.78,16,24.03,28.81,16.64l147.26-84.98c7.93-4.57,12.81-13.03,12.81-22.18v-169.24c0-14.79-16.01-24.03-28.81-16.63l-147.26,85.01c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-4" d="M464.18,782.84v169.9c0,14.77,15.98,24.02,28.79,16.65l144.08-82.94c7.94-4.57,12.83-13.03,12.83-22.2v-169.9c0-14.77-15.98-24.02-28.79-16.65l-144.08,82.94c-7.94,4.57-12.83,13.03-12.83,22.2Z"/>
<path id="Right__x3C_Path_x3E_" class="cls-4" d="M464.18,658.77v44.46c0,14.79,16,24.03,28.81,16.64l144.06-83.15c7.92-4.57,12.81-13.03,12.81-22.18v-44.46c0-14.79-16-24.03-28.81-16.64l-144.06,83.15c-7.92,4.57-12.81,13.03-12.81,22.18Z"/>
<path class="cls-3" d="M73.24,278.38l146.39,84.52c7.93,4.58,17.69,4.58,25.61,0l147.01-84.91c12.8-7.39,12.8-25.88,0-33.27l-146.36-84.5c-7.92-4.57-17.68-4.57-25.61,0l-147.03,84.88c-12.81,7.39-12.81,25.88,0,33.27Z"/>
<path class="cls-3" d="M44.82,511.04l147.26,85.01c12.8,7.39,28.81-1.85,28.81-16.63v-168.73c0-9.15-4.88-17.6-12.81-22.18l-147.26-85.01c-12.8-7.39-28.81,1.85-28.81,16.63v168.73c0,9.15,4.88,17.6,12.81,22.18Z"/>
</g>
<g>
<path d="M1077.23,753.61h-7.51c-5.26,0-9.53-4.27-9.53-9.53v-225.93c0-5.26,4.27-9.53,9.53-9.53h2.86c5.26,0,9.53-4.27,9.53-9.53v-3.81c0-5.26-4.27-9.53-9.53-9.53h-2.86c-5.26,0-9.53-4.27-9.53-9.53v-225.77c0-5.26,4.27-9.53,9.53-9.53h172.35c5.26,0,9.53,4.27,9.53,9.53v12.35c0,5.26,4.27,9.53,9.53,9.53h9.24c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h18.74c5.26,0,9.53-4.27,9.53-9.53v-40.62c0-5.26,4.27-9.53,9.53-9.53h84.48c5.26,0,9.53,4.27,9.53,9.53v12.35c0,5.26,4.27,9.53,9.53,9.53h18.74c5.26,0,9.53-4.27,9.53-9.53v-12.35c0-5.26,4.27-9.53,9.53-9.53h593.33c5.26,0,9.53,4.27,9.53,9.53v12.35c0,5.26,4.27,9.53,9.53,9.53h18.74c5.26,0,9.53-4.27,9.53-9.53v-12.35c0-5.26,4.27-9.53,9.53-9.53h84.47c5.26,0,9.53,4.27,9.53,9.53v12.35c0,5.26,4.27,9.53,9.53,9.53h18.74c5.26,0,9.53-4.27,9.53-9.53v-12.35c0-5.26,4.27-9.53,9.53-9.53h282.39c5.26,0,9.53,4.27,9.53,9.53v12.35c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v59.36c0,5.26-4.27,9.53-9.53,9.53h-37.51c-5.26,0-9.53,4.27-9.53,9.53v131.82c0,5.26,4.27,9.53,9.53,9.53h9.24c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h18.74c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h84.47c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h18.74c5.26,0,9.53-4.27,9.53-9.53v-9.21c0-5.26,4.27-9.53,9.53-9.53h169.3c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v9.21c0,5.26,4.27,9.53,9.53,9.53h9.21c5.26,0,9.53,4.27,9.53,9.53v181.04c0,5.26-4.27,9.53-9.53,9.53h-9.21c-5.26,0-9.53,4.27-9.53,9.53v8.86c0,5.26-4.27,9.53-9.53,9.53h-149.18c-5.26,0-9.53-4.27-9.53-9.53v-9.53c0-5.26-4.27-9.53-9.53-9.53h-22.23c-5.26,0-9.53,4.27-9.53,9.53v9.53c0,5.26-4.27,9.53-9.53,9.53h-82.57c-5.26,0-9.53-4.27-9.53-9.53v-9.53c0-5.26-4.27-9.53-9.53-9.53h-22.23c-5.26,0-9.53,4.27-9.53,9.53v9.53c0,5.26-4.27,9.53-9.53,9.53h-82.57c-5.26,0-9.53-4.27-9.53-9.53v-9.53c0-5.26-4.27-9.53-9.53-9.53h-22.23c-5.26,0-9.53,4.27-9.53,9.53v9.53c0,5.26-4.27,9.53-9.53,9.53h-168.32c-5.26,0-9.53-4.27-9.53-9.53v-9.53c0-5.26-4.27-9.53-9.53-9.53h-22.23c-5.26,0-9.53,4.27-9.53,9.53v9.53c0,5.26-4.27,9.53-9.53,9.53h-454.14c-5.26,0-9.53-4.27-9.53-9.53v-9.53c0-5.26-4.27-9.53-9.53-9.53h-22.23c-5.26,0-9.53,4.27-9.53,9.53v9.53c0,5.26-4.27,9.53-9.53,9.53h-82.57c-5.26,0-9.53-4.27-9.53-9.53v-9.53c0-5.26-4.27-9.53-9.53-9.53h-22.23c-5.26,0-9.53,4.27-9.53,9.53v9.53c0,5.26-4.27,9.53-9.53,9.53h-168.32c-5.26,0-9.53-4.27-9.53-9.53v-9.53c0-5.26-4.27-9.53-9.53-9.53h-22.23c-5.26,0-9.53,4.27-9.53,9.53v9.53c0,5.26-4.27,9.53-9.53,9.53h-82.57c-5.26,0-9.53-4.27-9.53-9.53v-9.53c0-5.26-4.27-9.53-9.53-9.53h-22.23c-5.26,0-9.53,4.27-9.53,9.53v9.55c0,5.25-4.25,9.52-9.51,9.53l-88.93.2c-5.27.01-9.55-4.26-9.55-9.53v-13.74c0-5.26-4.27-9.53-9.53-9.53Z"/>
<path id="Horizons" class="cls-4" d="M2867.64,572.31v-9.53c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h94.34c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h37.8c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37v-37.8c0-5.17-4.19-9.37-9.37-9.37h-94.34c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-37.8c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37ZM2660.4,525.15h-37.8c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-94.34c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-179.14c0-5.17-4.19-9.37-9.37-9.37ZM2396.46,553.41h9.53c5.17,0,9.37,4.19,9.37,9.37v122.6c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-122.6c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37ZM2283.38,694.75h66.07c5.17,0,9.37-4.19,9.37-9.37v-122.6c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v122.6c0,5.17,4.19,9.37,9.37,9.37ZM2151.58,525.15h-179.14c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h94.34c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h179.14c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-94.34c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-37.8c0-5.17-4.19-9.37-9.37-9.37ZM1906.53,713.65v-179.14c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37ZM1784.09,609.95h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-66.07c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-179.14c0-5.17,4.19-9.37,9.37-9.37h150.87c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17-4.19,9.37-9.37,9.37ZM1736.92,600.58v-37.8c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37ZM1520.15,553.41h9.53c5.17,0,9.37,4.19,9.37,9.37v122.6c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-122.6c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37ZM1482.51,685.39v-122.6c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v122.6c0,5.17,4.19,9.37,9.37,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37ZM1275.27,525.15h-37.8c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-66.07c-5.17,0-9.37-4.19-9.37-9.37v-66.07c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-66.07c0-5.17,4.19-9.37,9.37-9.37h66.07c5.17,0,9.37,4.19,9.37,9.37v66.07c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-179.14c0-5.17-4.19-9.37-9.37-9.37Z"/>
<g id="Distant">
<path class="cls-1" d="M2528.43,280.1v9.53c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v150.87c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-150.87c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h150.87c5.17,0,9.37,4.19,9.37,9.37ZM2321.18,270.73h-37.8c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-94.34c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-179.14c0-5.17-4.19-9.37-9.37-9.37ZM2057.24,308.42h9.53c5.17,0,9.37,4.19,9.37,9.37v141.45c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-37.8c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17-4.19,9.37-9.37,9.37h-37.8c-5.17,0-9.37-4.19-9.37-9.37v-141.45c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-18.95c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v18.95c0,5.17,4.19,9.37,9.37,9.37ZM2019.6,374.44v-66.07c0-5.17-4.19-9.37-9.37-9.37h-66.07c-5.17,0-9.37,4.19-9.37,9.37v66.07c0,5.17,4.19,9.37,9.37,9.37h66.07c5.17,0,9.37-4.19,9.37-9.37ZM1840.63,270.73h-150.87c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37,4.19,9.37,9.37v150.87c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-150.87c0-5.17,4.19-9.37,9.37-9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37ZM1604.95,327.27h37.8c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-122.6c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v37.8c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h94.34c5.17,0,9.37,4.19,9.37,9.37v37.8c0,5.17-4.19,9.37-9.37,9.37h-66.07c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h122.6c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37h9.53c5.17,0,9.37-4.19,9.37-9.37v-37.8c0-5.17-4.19-9.37-9.37-9.37h-9.53c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-94.34c-5.17,0-9.37-4.19-9.37-9.37v-37.8c0-5.17,4.19-9.37,9.37-9.37h66.07c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37ZM1397.71,459.24v-179.14c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v179.14c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37ZM1265.74,327.27h9.53c5.17,0,9.37,4.19,9.37,9.37v66.07c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-9.53c-5.17,0-9.37,4.19-9.37,9.37v9.53c0,5.17-4.19,9.37-9.37,9.37h-122.6c-5.17,0-9.37-4.19-9.37-9.37v-179.14c0-5.17,4.19-9.37,9.37-9.37h122.6c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37h9.53c5.17,0,9.37,4.19,9.37,9.37v9.53c0,5.17,4.19,9.37,9.37,9.37ZM1209.2,412.07h15.81c5.17,0,9.37-4.19,9.37-9.37v-66.07c0-5.17-4.19-9.37-9.37-9.37h-15.81c-5.17,0-9.37-4.19-9.37-9.37v-9.53c0-5.17-4.19-9.37-9.37-9.37h-37.8c-5.17,0-9.37,4.19-9.37,9.37v122.6c0,5.17,4.19,9.37,9.37,9.37h37.8c5.17,0,9.37-4.19,9.37-9.37v-9.53c0-5.17,4.19-9.37,9.37-9.37Z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 191 KiB

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 172 KiB

Before

Width:  |  Height:  |  Size: 194 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 174 KiB

@@ -24,7 +24,7 @@ package com.seibel.distanthorizons.api.enums.config;
* LOW <br>
* MEDIUM <br>
* HIGH <br>
* UNLIMITED <br>
* EXTREME <br>
*
* @since API 2.0.0
* @version 2024-4-6
@@ -36,7 +36,7 @@ public enum EDhApiHorizontalQuality
// when removing items up the API major version
// FIXME any quadraticBase less than 2.0f has issues with DetailDistanceUtil, and will always return the lowest detail level.
// Note: any quadraticBase less than 2.0f has issues with DetailDistanceUtil, and will always return the lowest detail level.
// So for now we are limiting the lowest value to 2.0
// LOWEST was originally 1.0f and LOW was 1.5f
@@ -0,0 +1,58 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.api.enums.config;
/**
* Handles how Minecraft's rendering
* is faded out to smooth the transition
* between MC and DH rendering. <br><br>
*
* NONE, <br>
* SINGLE_PASS, <br>
* DOUBLE_PASS, <br>
*
* @since API 4.0.0
* @version 2024-10-3
*/
public enum EDhApiMcRenderingFadeMode
{
// Reminder:
// when adding items up the API minor version
// when removing items up the API major version
/**
* No fading is done, there will be a pronounced border between
* Minecraft and Distant Horizons. <br>
* Fastest.
*/
NONE,
/**
* Fading only runs after the translucent render pass. <br>
* Looks good for the tops of oceans and rivers, but
* doesn't fade the opaque blocks underwater.
*/
SINGLE_PASS,
/**
* Fading runs after both opaque and translucent render passes.
* Slowest, but oceans and rivers look better.
*/
DOUBLE_PASS;
}
@@ -26,7 +26,9 @@ import com.seibel.distanthorizons.coreapi.util.MathUtil;
* LOW <br>
* MEDIUM <br>
* HIGH <br>
* VERY_HIGH <br>
* EXTREME <br>
* PIXEL_ART <br>
*
* @author Leonardo Amato
* @version 2024-4-6
@@ -34,13 +36,13 @@ import com.seibel.distanthorizons.coreapi.util.MathUtil;
*/
public enum EDhApiVerticalQuality
{
HEIGHT_MAP( new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}),
LOW( new int[]{4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1}),
MEDIUM( new int[]{6, 4, 3, 3, 3, 3, 3, 2, 2, 2, 1}),
HIGH( new int[]{16, 8, 4, 3, 3, 3, 3, 3, 3, 3, 1}),
VERY_HIGH( new int[]{32, 16, 8, 4, 4, 3, 3, 3, 3, 3, 1}),
EXTREME( new int[]{64, 32, 8, 4, 4, 3, 3, 3, 3, 3, 1}),
PIXEL_ART( new int[]{512, 64, 16, 8, 4, 3, 3, 3, 3, 3, 1});
HEIGHT_MAP( new int[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}),
LOW( new int[]{4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 1}),
MEDIUM( new int[]{6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 1}),
HIGH( new int[]{16, 16, 12, 12, 8, 8, 8, 8, 8, 8, 1}),
VERY_HIGH( new int[]{32, 16, 12, 12, 12, 12, 12, 12, 12, 12, 1}),
EXTREME( new int[]{64, 32, 32, 32, 16, 16, 16, 16, 16, 16, 1}),
PIXEL_ART( new int[]{512, 256, 128, 64, 32, 32, 16, 16, 16, 16, 1});
/** represents how many LODs can be rendered in a single vertical slice */
public final int[] maxVerticalData;
@@ -24,10 +24,13 @@ package com.seibel.distanthorizons.api.enums.rendering;
* FOG_ENABLED, <br>
* FOG_DISABLED <br>
*
* @deprecated since API 4.0.0 since {@link EDhApiFogDrawMode#USE_OPTIFINE_SETTING} is no longer supported.
*
* @author James Seibel
* @since API 2.0.0
* @version 2022-6-2
*/
@Deprecated
public enum EDhApiFogDrawMode
{
// Reminder:
@@ -35,9 +38,12 @@ public enum EDhApiFogDrawMode
// when removing items up the API major version
/**
* Use whatever Fog setting optifine is using.
* If optifine isn't installed this defaults to FOG_ENABLED.
* Use whatever Fog setting Optifine is using.
* If Optifine isn't installed this defaults to {@link EDhApiFogDrawMode#FOG_ENABLED}.
*
* @deprecated Since API 4.0.0 is equivalent to {@link EDhApiFogDrawMode#FOG_ENABLED}
*/
@Deprecated
USE_OPTIFINE_SETTING,
FOG_ENABLED,
@@ -25,7 +25,7 @@ package com.seibel.distanthorizons.api.enums.rendering;
* EXPONENTIAL_SQUARED <br>
*
* @author Leetom
* @version 2022-6-30
* @version 2024-11-09
* @since API 2.0.0
*/
public enum EDhApiFogFalloff
@@ -35,8 +35,17 @@ public enum EDhApiFogFalloff
// when removing items up the API major version
LINEAR,
EXPONENTIAL,
EXPONENTIAL_SQUARED,
LINEAR(0),
EXPONENTIAL(1),
EXPONENTIAL_SQUARED(2);
/**
* Stable version of {@link EDhApiFogFalloff#ordinal()}
* @since API 4.0.0
*/
public final int value;
EDhApiFogFalloff(int value) { this.value = value; }
}
@@ -31,28 +31,28 @@ package com.seibel.distanthorizons.api.enums.rendering;
* @version 2024-4-6
* @since API 2.0.0
*/
public enum EDhApiHeightFogMode
public enum EDhApiHeightFogDirection
{
// Reminder:
// when adding items up the API minor version
// when removing items up the API major version
ABOVE_CAMERA(true, true, false),
BELOW_CAMERA(true, false, true),
ABOVE_AND_BELOW_CAMERA(true, true, true),
ABOVE_SET_HEIGHT(false, true, false),
BELOW_SET_HEIGHT(false, false, true),
ABOVE_AND_BELOW_SET_HEIGHT(false, true, true);
ABOVE_CAMERA (true, true, false),
BELOW_CAMERA (true, false, true),
ABOVE_AND_BELOW_CAMERA (true, true, true),
ABOVE_SET_HEIGHT (false, true, false),
BELOW_SET_HEIGHT (false, false, true),
ABOVE_AND_BELOW_SET_HEIGHT (false, true, true);
public final boolean basedOnCamera;
public final boolean above;
public final boolean below;
public final boolean fogAppliesUp;
public final boolean fogAppliesDown;
EDhApiHeightFogMode(boolean basedOnCamera, boolean above, boolean below)
EDhApiHeightFogDirection(boolean basedOnCamera, boolean fogAppliesUp, boolean fogAppliesDown)
{
this.basedOnCamera = basedOnCamera;
this.above = above;
this.below = below;
this.fogAppliesUp = fogAppliesUp;
this.fogAppliesDown = fogAppliesDown;
}
}
@@ -20,10 +20,11 @@
package com.seibel.distanthorizons.api.enums.rendering;
/**
* BASIC <br>
* IGNORE_HEIGHT <br>
* ADDITION <br>
* SPHERICAL <br>
* CYLINDRICAL <br>
* <br>
* MAX <br>
* ADDITION <br>
* MULTIPLY <br>
* INVERSE_MULTIPLY <br>
* LIMITED_ADDITION <br>
@@ -37,14 +38,36 @@ package com.seibel.distanthorizons.api.enums.rendering;
*/
public enum EDhApiHeightFogMixMode
{
BASIC,
IGNORE_HEIGHT,
ADDITION,
MAX,
MULTIPLY,
INVERSE_MULTIPLY,
LIMITED_ADDITION,
MULTIPLY_ADDITION,
INVERSE_MULTIPLY_ADDITION,
AVERAGE,
/**
* Basic just means the fog will be based on the fragment depth
* not on any special height calculation IE spherical fog. <br><br>
*
* Not to be confused with {@link EDhApiHeightFogMixMode#CYLINDRICAL}
* which causes fog to only apply based on horizontal distance.
*/
SPHERICAL(0),
/**
* Fog is applied based on horizontal distance from the camera,
* IE cylindrical fog.
*/
CYLINDRICAL(1),
MAX(2),
ADDITION(3),
MULTIPLY(4),
INVERSE_MULTIPLY(5),
LIMITED_ADDITION(6),
MULTIPLY_ADDITION(7),
INVERSE_MULTIPLY_ADDITION(8),
AVERAGE(9);
/**
* Stable version of {@link EDhApiFogFalloff#ordinal()}
* @since API 4.0.0
*/
public final int value;
EDhApiHeightFogMixMode(int value) { this.value = value; }
}
@@ -22,13 +22,14 @@ package com.seibel.distanthorizons.api.enums.worldGeneration;
/**
* PRE_EXISTING_ONLY <br>
* SURFACE <br>
* FEATURES <br><br>
* FEATURES <br>
* FULL <br><br>
*
* In order of fastest to slowest.
*
* @author James Seibel
* @author Leonardo Amato
* @version 2022-12-10
* @version 2024-12-13
* @since API 1.0.0
*/
public enum EDhApiDistantGeneratorMode
@@ -73,7 +74,17 @@ public enum EDhApiDistantGeneratorMode
* NOTE: This may cause world generation bugs or instability,
* since some features can cause concurrentModification exceptions.
*/
FEATURES((byte) 5);
FEATURES((byte) 5),
/**
* Ask the server to generate/load each chunk.
* This is the most compatible and will generate structures correctly,
* but may cause server/simulation lag. <br><br>
*
* Unlike other modes this option DOES save generated chunks to
* Minecraft's region files.
*/
INTERNAL_SERVER((byte) 6);
@@ -19,8 +19,8 @@
package com.seibel.distanthorizons.api.enums.worldGeneration;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiDistantGeneratorMode;
import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
import com.seibel.distanthorizons.api.objects.data.IDhApiFullDataSource;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;
@@ -28,16 +28,17 @@ import java.util.function.Consumer;
/**
* VANILLA_CHUNKS, <br>
* API_CHUNKS <br>
* API_DATA_SOURCES <br>
*
* @author Builderb0y, James Seibel
* @version 2023-12-21
* @version 2024-10-5
* @since API 2.0.0
*/
public enum EDhApiWorldGeneratorReturnType
{
/**
* when this constant is returned by {@link IDhApiWorldGenerator#getReturnType()},
* {@link IDhApiWorldGenerator#generateChunks(int, int, byte, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
* {@link IDhApiWorldGenerator#generateChunks(int, int, int, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
* will be used when generating terrain.
*
* @since API 2.0.0
@@ -46,11 +47,20 @@ public enum EDhApiWorldGeneratorReturnType
/**
* when this constant is returned by {@link IDhApiWorldGenerator#getReturnType()},
* {@link IDhApiWorldGenerator#generateApiChunks(int, int, byte, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
* {@link IDhApiWorldGenerator#generateApiChunks(int, int, int, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
* will be used when generating terrain.
*
* @since API 2.0.0
*/
API_CHUNKS;
API_CHUNKS,
/**
* when this constant is returned by {@link IDhApiWorldGenerator#getReturnType()},
* {@link IDhApiWorldGenerator#generateLod(int, int, int, int, byte, IDhApiFullDataSource, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
* will be used when generating terrain.
*
* @since API 4.0.0
*/
API_DATA_SOURCES;
}
@@ -42,22 +42,28 @@ public interface IDhApiFogConfig extends IDhApiConfigGroup
// inner configs //
//===============//
/**
* The advanced fog config.
*/
/** The advanced fog config. */
IDhApiFarFogConfig farFog();
/**
* The height fog config.
*/
/** The height fog config. */
IDhApiHeightFogConfig heightFog();
//====================//
// basic fog settings //
//====================//
/** Should be used to enable/disable fog rendering. */
/**
* Used to enable/disable DH fog rendering.
* @deprecated since API 4.0.0 use {@link IDhApiFogConfig#enableDhFog}
*/
@Deprecated
IDhApiConfigValue<EDhApiFogDrawMode> drawMode();
/**
* Used to enable/disable DH fog rendering.
*
* @since API 4.0.0
*/
IDhApiConfigValue<Boolean> enableDhFog();
/** Can be used to enable support with mods that change vanilla MC's fog color. */
IDhApiConfigValue<EDhApiFogColorMode> color();
@@ -65,7 +71,19 @@ public interface IDhApiFogConfig extends IDhApiConfigGroup
/**
* If enabled attempts to disable vanilla MC's fog on real chunks. <br>
* May not play nice with other fog editing mods.
*
* @deprecated since API 4.0.0 use {@link IDhApiFogConfig#enableVanillaFog()}
*/
@Deprecated
IDhApiConfigValue<Boolean> disableVanillaFog();
/**
* If set to false DH will attempt to disable vanilla MC's fog on real chunks. <br>
* May not play nice with other fog editing mods.
*
* @since API 4.0.0
*/
IDhApiConfigValue<Boolean> enableVanillaFog();
}
@@ -21,7 +21,7 @@ package com.seibel.distanthorizons.api.interfaces.config.client;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiFogFalloff;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogMixMode;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogMode;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogDirection;
import com.seibel.distanthorizons.api.interfaces.config.IDhApiConfigGroup;
import com.seibel.distanthorizons.api.interfaces.config.IDhApiConfigValue;
@@ -42,11 +42,14 @@ public interface IDhApiHeightFogConfig extends IDhApiConfigGroup
/** Defines how the height fog mixes. */
IDhApiConfigValue<EDhApiHeightFogMixMode> heightFogMixMode();
/** Defines how the height fog is drawn relative to the camera or world. */
IDhApiConfigValue<EDhApiHeightFogMode> heightFogMode();
/**
* Defines which direction height fog is drawn relative to the world.
* @since API 4.0.0
*/
IDhApiConfigValue<EDhApiHeightFogDirection> heightFogDirection();
/**
* Defines the height fog's base height if {@link IDhApiHeightFogConfig#heightFogMode()}
* Defines the height fog's base height if {@link IDhApiHeightFogConfig#heightFogDirection()}
* is set to use a specific height.
*/
IDhApiConfigValue<Double> heightFogBaseHeight();
@@ -26,33 +26,31 @@ import com.seibel.distanthorizons.api.interfaces.config.IDhApiConfigGroup;
* Distant Horizons' threading configuration.
*
* @author James Seibel
* @version 2023-10-29
* @version 2024-12-26
* @since API 1.0.0
*/
public interface IDhApiMultiThreadingConfig extends IDhApiConfigGroup
{
/**
* Defines how many world generator threads are used to generate
* terrain outside Minecraft's vanilla render distance. <br>
* <br>
* If the number of threads is less than 1 it will be treated as a percentage
* representing how often the single thread will actively generate terrain.
* Defines how many threads Distant Horizons
* uses.
*
* @since API 4.0.0
*/
IDhApiConfigValue<Integer> worldGeneratorThreads();
/** Defines how many file handler threads are used. */
IDhApiConfigValue<Integer> fileHandlerThreads();
IDhApiConfigValue<Integer> threadCount();
/**
* Defines how many threads are used
* to build LODs. <br><br>
*
* This includes: <br>
* - lighting <br>
* - Chunk -> LOD conversion <br>
* - Buffer generation <br>
* Defines how many long Distant Horizons
* threads will spend running vs sleeping.
* This is helpful when reducing the CPU
* load on low end CPUs.
* 1.0 = 100% uptime
* 0.5 = 50% uptime
* 0.1 = 10% uptime
*
* @since API 4.0.0
*/
IDhApiConfigValue<Integer> lodBuilderThreads();
IDhApiConfigValue<Double> threadRuntimeRatio();
}
@@ -39,15 +39,4 @@ public interface IDhApiMultiplayerConfig extends IDhApiConfigGroup
*/
IDhApiConfigValue<EDhApiServerFolderNameMode> folderSavingMode();
/**
* Defines the necessary similarity (as a percent) that two potential levels
* need in order to be considered the same. <br> <br>
*
* Setting this to zero causes every level of a specific dimension type to be considered
* the same level. <br>
* Setting this to a non-zero value allows for usage in servers that user Multiverse
* or similar mods.
*/
IDhApiConfigValue<Double> multiverseSimilarityRequirement();
}
@@ -0,0 +1,51 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.api.interfaces.override.levelHandling;
import com.seibel.distanthorizons.api.enums.EDhApiDetailLevel;
import com.seibel.distanthorizons.api.interfaces.override.IDhApiOverrideable;
import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper;
import com.seibel.distanthorizons.api.objects.math.DhApiMat4f;
import java.io.File;
/**
* Used to override which folder DH uses when loading a level.
* Can be used to redirect LOD data saving into a more manageable location
* or for replays/local-servers that are running out of a different folder
* than where the DH data is normally saved.
*
* @author James Seibel
* @version 2024-9-28
* @since API 4.0.0
*/
public interface IDhApiSaveStructure extends IDhApiOverrideable
{
/**
* Called when DH first loads a level to determine which folder it should use
* for file handling.
*
* @param currentFilePath the file path DH is planning to use. If this method returns null this is the file path that will be used.
* @param levelWrapper the level this file path is used for.
* @return null if you don't want to override the file path. Non-null if you want to change the file path.
*/
File overrideFilePath(File currentFilePath, IDhApiLevelWrapper levelWrapper);
}
@@ -46,10 +46,6 @@ public abstract class AbstractDhApiChunkWorldGenerator implements Closeable, IDh
public final byte getSmallestDataDetailLevel() { return EDhApiDetailLevel.BLOCK.detailLevel; }
@Override
public final byte getLargestDataDetailLevel() { return EDhApiDetailLevel.BLOCK.detailLevel; }
@Override
public final byte getMinGenerationGranularity() { return EDhApiDetailLevel.CHUNK.detailLevel; }
@Override
public final byte getMaxGenerationGranularity() { return (byte) (EDhApiDetailLevel.CHUNK.detailLevel + 2); }
@@ -60,17 +56,14 @@ public abstract class AbstractDhApiChunkWorldGenerator implements Closeable, IDh
@Override
public final CompletableFuture<Void> generateChunks(
int chunkPosMinX, int chunkPosMinZ,
byte granularity, byte targetDataDetail, EDhApiDistantGeneratorMode generatorMode,
int generationRequestChunkWidthCount, byte targetDataDetail, EDhApiDistantGeneratorMode generatorMode,
ExecutorService worldGeneratorThreadPool, Consumer<Object[]> resultConsumer) throws ClassCastException
{
return CompletableFuture.runAsync(() ->
{
// TODO what does this mean?
int genChunkWidth = BitShiftUtil.powerOfTwo(granularity - 4);
for (int chunkX = chunkPosMinX; chunkX < chunkPosMinX + genChunkWidth; chunkX++)
for (int chunkX = chunkPosMinX; chunkX < chunkPosMinX + generationRequestChunkWidthCount; chunkX++)
{
for (int chunkZ = chunkPosMinZ; chunkZ < chunkPosMinZ + genChunkWidth; chunkZ++)
for (int chunkZ = chunkPosMinZ; chunkZ < chunkPosMinZ + generationRequestChunkWidthCount; chunkZ++)
{
Object[] rawMcObjectArray = this.generateChunk(chunkX, chunkZ, generatorMode);
resultConsumer.accept(rawMcObjectArray);
@@ -83,7 +76,7 @@ public abstract class AbstractDhApiChunkWorldGenerator implements Closeable, IDh
public final CompletableFuture<Void> generateApiChunks(
int chunkPosMinX,
int chunkPosMinZ,
byte granularity,
int generationRequestChunkWidthCount,
byte targetDataDetail,
EDhApiDistantGeneratorMode generatorMode,
ExecutorService worldGeneratorThreadPool,
@@ -92,12 +85,9 @@ public abstract class AbstractDhApiChunkWorldGenerator implements Closeable, IDh
{
return CompletableFuture.runAsync(() ->
{
// TODO what does this mean?
int genChunkWidth = BitShiftUtil.powerOfTwo(granularity - 4);
for (int chunkX = chunkPosMinX; chunkX < chunkPosMinX + genChunkWidth; chunkX++)
for (int chunkX = chunkPosMinX; chunkX < chunkPosMinX + generationRequestChunkWidthCount; chunkX++)
{
for (int chunkZ = chunkPosMinZ; chunkZ < chunkPosMinZ + genChunkWidth; chunkZ++)
for (int chunkZ = chunkPosMinZ; chunkZ < chunkPosMinZ + generationRequestChunkWidthCount; chunkZ++)
{
DhApiChunk apiChunk = this.generateApiChunk(chunkX, chunkZ, generatorMode);
resultConsumer.accept(apiChunk);
@@ -115,10 +105,10 @@ public abstract class AbstractDhApiChunkWorldGenerator implements Closeable, IDh
* @param chunkPosZ the chunk Z position in the level (not to be confused with the chunk's BlockPos in the level)
* @param generatorMode how far into the world gen pipeline this method should run. See {@link EDhApiDistantGeneratorMode} for additional documentation.
*
* @return See {@link IDhApiWorldGenerator#generateChunks(int, int, byte, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer) IDhApiWorldGenerator.generateChunks}
* @return See {@link IDhApiWorldGenerator#generateChunks(int, int, int, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer) IDhApiWorldGenerator.generateChunks}
* for the list of Object's this method should return along with additional documentation.
*
* @see IDhApiWorldGenerator#generateChunks(int, int, byte, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer) IDhApiWorldGenerator#generateChunks
* @see IDhApiWorldGenerator#generateChunks(int, int, int, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer) IDhApiWorldGenerator#generateChunks
*/
public abstract Object[] generateChunk(int chunkPosX, int chunkPosZ, EDhApiDistantGeneratorMode generatorMode);
@@ -133,7 +123,7 @@ public abstract class AbstractDhApiChunkWorldGenerator implements Closeable, IDh
* @return A {@link DhApiChunk} with the generated {@link DhApiTerrainDataPoint} including air blocks.
* Note: if air blocks aren't included with the proper lighting, lower detail levels will appear as black/unlit.
*
* @see IDhApiWorldGenerator#generateApiChunks(int, int, byte, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)
* @see IDhApiWorldGenerator#generateApiChunks(int, int, int, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)
*
* @since API 3.0.0
*/
@@ -24,6 +24,7 @@ import com.seibel.distanthorizons.api.interfaces.override.IDhApiOverrideable;
import com.seibel.distanthorizons.api.enums.EDhApiDetailLevel;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiDistantGeneratorMode;
import com.seibel.distanthorizons.api.objects.data.DhApiChunk;
import com.seibel.distanthorizons.api.objects.data.IDhApiFullDataSource;
import java.io.Closeable;
import java.util.concurrent.CompletableFuture;
@@ -32,7 +33,7 @@ import java.util.function.Consumer;
/**
* @author James Seibel
* @version 2023-6-22
* @version 2024-10-07
* @since API 1.0.0
*/
public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
@@ -43,19 +44,17 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
/**
* Defines the smallest datapoint size that can be generated at a time. <br>
* Minimum detail level is 0 (1 block) <br>
* Maximum detail level (smallest numerical value) is 0 (1 block) <br>
* Default detail level is 0 <br>
* For more information on what detail levels represent see: {@link EDhApiDetailLevel}. <br><br>
*
* TODO: System currently only supports 1x1 block per data.
*
*
* @see EDhApiDetailLevel
* @since API 1.0.0
*/
default byte getSmallestDataDetailLevel() { return EDhApiDetailLevel.BLOCK.detailLevel; }
/**
* Defines the largest datapoint size that can be generated at a time. <br>
* Minimum detail level is 0 (1 block) <br>
* Maximum detail level (smallest numerical value) is 0 (1 block) <br>
* Default detail level is 0 <br>
* For more information on what detail levels represent see: {@link EDhApiDetailLevel}.
*
@@ -64,56 +63,18 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
*/
default byte getLargestDataDetailLevel() { return EDhApiDetailLevel.BLOCK.detailLevel; }
/**
* When creating generation requests the system will attempt to group nearby tasks together. <br><br>
* What is the minimum size a single generation call can batch together? <br>
*
* Minimum detail level is 4 (the size of a MC chunk) <br>
* Default detail level is 4 <br>
* For more information on what detail levels represent see: {@link EDhApiDetailLevel}.
*
* @see EDhApiDetailLevel
* @since API 1.0.0
*/
default byte getMinGenerationGranularity() { return EDhApiDetailLevel.CHUNK.detailLevel; }
/**
* When creating generation requests the system will attempt to group nearby tasks together. <br><br>
* What is the maximum size a single generation call can batch together? <br>
*
* Minimum detail level is 4 (the size of a MC chunk) <br>
* Default detail level is 6 (4x4 chunks) <br>
* For more information on what detail levels represent see: {@link EDhApiDetailLevel}.
*
* @see EDhApiDetailLevel
* @since API 1.0.0
*/
default byte getMaxGenerationGranularity() { return (byte) (EDhApiDetailLevel.CHUNK.detailLevel + 2); }
/**
* Starting in API 3.0.0 DH now handles future queuing/management internally. <br><br>
*
* Previous description: <br>
* true if the generator is unable to accept new generation requests. <br>
*
* @since API 1.0.0
* @deprecated API 3.0.0
*/
@Deprecated
default boolean isBusy() { return false; }
/**
* Only used if {@link #getReturnType()} returns {@link EDhApiWorldGeneratorReturnType#API_CHUNKS}. <Br>
* If true DH will run additional validation on the {@link DhApiChunk}'s returned. <Br>
* Used if {@link #getReturnType()} returns {@link EDhApiWorldGeneratorReturnType#API_CHUNKS} or {@link EDhApiWorldGeneratorReturnType#API_DATA_SOURCES}. <Br>
* If true DH will run additional validation on the {@link DhApiChunk} or {@link IDhApiFullDataSource}'s returned. <Br>
* This should be disabled during release but should be enabled during development to help spot issues with your data format.
*
* @see #getReturnType()
* @see DhApiChunk
* @see IDhApiFullDataSource
* @see EDhApiWorldGeneratorReturnType#API_CHUNKS
* @since API 3.0.0
* @since API 4.0.0
*/
default boolean runApiChunkValidation() { return true; }
default boolean runApiValidation() { return true; }
@@ -143,9 +104,9 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
*
* @param chunkPosMinX the chunk X position closest to negative infinity
* @param chunkPosMinZ the chunk Z position closest to negative infinity
* @param granularity TODO find a central location to store the definition of granularity. For now it is stored in the Core method: WorldGenerationQueue#startGenerationEvent
* @param generationRequestChunkWidthCount how many chunks wide you should generate
* @param targetDataDetail the LOD Detail level requested to generate. See {@link EDhApiDetailLevel} for additional information.
* @param generatorMode how far into the world gen pipeline this method run. See {@link EDhApiDistantGeneratorMode} for additional documentation.
* @param generatorMode how far into the world gen pipeline this method should run. See {@link EDhApiDistantGeneratorMode} for additional documentation.
* @param worldGeneratorThreadPool the thread pool that should be used when generating the returned {@link CompletableFuture}.
* @param resultConsumer the consumer that should be fired whenever a chunk finishes generating.
*
@@ -156,7 +117,7 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
default CompletableFuture<Void> generateChunks(
int chunkPosMinX,
int chunkPosMinZ,
byte granularity,
int generationRequestChunkWidthCount,
byte targetDataDetail,
EDhApiDistantGeneratorMode generatorMode,
ExecutorService worldGeneratorThreadPool,
@@ -165,7 +126,7 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
{
throw new UnsupportedOperationException();
}
/**
* This method is called by Distant Horizons to generate terrain over a given area when
* {@link #getReturnType()} returns {@link EDhApiWorldGeneratorReturnType#API_CHUNKS}. <br><br>
@@ -179,9 +140,9 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
*
* @param chunkPosMinX the chunk X position closest to negative infinity
* @param chunkPosMinZ the chunk Z position closest to negative infinity
* @param granularity TODO find a central location to store the definition of granularity. For now it is stored in the Core method: WorldGenerationQueue#startGenerationEvent
* @param generationRequestChunkWidthCount how many chunks wide you should generate
* @param targetDataDetail the LOD Detail level requested to generate. See {@link EDhApiDetailLevel} for additional information.
* @param generatorMode how far into the world gen pipeline this method run. See {@link EDhApiDistantGeneratorMode} for additional documentation.
* @param generatorMode how far into the world gen pipeline this method should run. See {@link EDhApiDistantGeneratorMode} for additional documentation.
* @param worldGeneratorThreadPool the thread pool that should be used when generating the returned {@link CompletableFuture}.
* @param resultConsumer the consumer that should be fired whenever a chunk finishes generating.
*
@@ -192,7 +153,7 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
default CompletableFuture<Void> generateApiChunks(
int chunkPosMinX,
int chunkPosMinZ,
byte granularity,
int generationRequestChunkWidthCount,
byte targetDataDetail,
EDhApiDistantGeneratorMode generatorMode,
ExecutorService worldGeneratorThreadPool,
@@ -201,11 +162,51 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
{
throw new UnsupportedOperationException();
}
/**
* This method is called by Distant Horizons to generate terrain over a given area when
* {@link #getReturnType()} returns {@link EDhApiWorldGeneratorReturnType#API_DATA_SOURCES}. <br><br>
*
* After the {@link IDhApiWorldGenerator} has been generated, it should be passed into the
* resultConsumer's {@link Consumer#accept(Object)} method.
* Note: if air blocks aren't included in the with the {@link DhApiChunk} with proper lighting, lower detail levels will appear as black/unlit.
*
* @implNote the default implementation of this method throws an {@link UnsupportedOperationException},
* and must be overridden when {@link #getReturnType()} returns {@link EDhApiWorldGeneratorReturnType#API_CHUNKS}.
*
* @param chunkPosMinX the chunk X position closest to negative infinity
* @param chunkPosMinZ the chunk Z position closest to negative infinity
* @param lodPosX the LOD's X position, relative to the given {@link EDhApiDetailLevel}
* @param lodPosZ the LOD's Z position, relative to the given {@link EDhApiDetailLevel}
* @param detailLevel the LOD Detail level requested to generate. See {@link EDhApiDetailLevel} for additional information.
* @param pooledFullDataSource The data source you should populate during your world generation.
* This data source is pooled by DH and may be reused multiple times by different internal DH systems. <br>
* This data source should <strong>not</strong> be referenced or stored outside of this method nor the executor provided by worldGeneratorThreadPool.
* <strong>Attempting to do so will corrupt DH's data.</strong>
* @param generatorMode how far into the world gen pipeline this method should run. See {@link EDhApiDistantGeneratorMode} for additional documentation.
* @param worldGeneratorThreadPool the thread pool that should be used when generating the returned {@link CompletableFuture}.
* @param resultConsumer the consumer that should be fired whenever a chunk finishes generating.
*
* @return a future that should run on the worldGeneratorThreadPool and complete once the given generation task has completed.
*
* @since API 4.0.0
*/
default CompletableFuture<Void> generateLod(
int chunkPosMinX, int chunkPosMinZ,
int lodPosX, int lodPosZ, byte detailLevel,
IDhApiFullDataSource pooledFullDataSource,
EDhApiDistantGeneratorMode generatorMode,
ExecutorService worldGeneratorThreadPool,
Consumer<IDhApiFullDataSource> resultConsumer
)
{
throw new UnsupportedOperationException();
}
/**
* This method controls how Distant Horizons requests generated chunks.
* By default, the return value is {@link EDhApiWorldGeneratorReturnType#VANILLA_CHUNKS},
* which means that {@link #generateChunks(int, int, byte, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
* which means that {@link #generateChunks(int, int, int, byte, EDhApiDistantGeneratorMode, ExecutorService, Consumer)}
* will be invoked whenever Distant Horizons wants to generate terrain with this world generator.
*
* @since API 2.0.0
@@ -238,4 +239,5 @@ public interface IDhApiWorldGenerator extends Closeable, IDhApiOverrideable
void close();
}
@@ -23,6 +23,8 @@ import com.seibel.distanthorizons.api.interfaces.IDhApiUnsafeWrapper;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiLevelType;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister;
import java.io.File;
/**
* Can be either a Server or Client level.<br>
* A level is equivalent to a dimension in vanilla Minecraft.
@@ -37,6 +39,13 @@ public interface IDhApiLevelWrapper extends IDhApiUnsafeWrapper
/** @since API 4.0.0 */
String getDimensionName();
/**
* Returns a string intended to uniquely identify this level.
*
* @since API 4.0.0
*/
String getDhIdentifier();
EDhApiLevelType getLevelType();
@@ -72,4 +81,15 @@ public interface IDhApiLevelWrapper extends IDhApiUnsafeWrapper
*/
IDhApiCustomRenderRegister getRenderRegister();
/**
* Returns the folder Distant Horizons uses to save
* data associated with this level.
* Will return null if the level is not loaded.
*
* @since API 4.0.0
*/
File getDhSaveFolder();
}
@@ -24,14 +24,39 @@ package com.seibel.distanthorizons.api.interfaces.world;
* A world is equivalent to a single server connection or a singleplayer world.
*
* @author James Seibel
* @version 2022-11-20
* @version 2024-9-27
* @since API 1.0.0
*/
public interface IDhApiWorldProxy
{
//===================//
// getters / setters //
//===================//
/** Returns true if a world is loaded. */
boolean worldLoaded();
/**
* Defaults to false. <br>
* Setting this to true will prevent DH from updating or creating new LODs.
*
* @since API 4.0.0
* @see IDhApiWorldProxy#getReadOnly()
* @throws IllegalStateException if no world is loaded
*/
void setReadOnly(boolean readOnly) throws IllegalStateException;
/**
* @since API 4.0.0
* @see IDhApiWorldProxy#setReadOnly(boolean)
* @throws IllegalStateException if no world is loaded
*/
boolean getReadOnly() throws IllegalStateException;
//================//
// level handlers //
//================//
/**
* In singleplayer this will return the level the player is currently in. <br>
@@ -0,0 +1,64 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.api.methods.events.abstractEvents;
import com.seibel.distanthorizons.api.interfaces.world.IDhApiWorldProxy;
import com.seibel.distanthorizons.api.methods.events.interfaces.IDhApiEvent;
import com.seibel.distanthorizons.api.methods.events.interfaces.IDhApiEventParam;
import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiEventParam;
/**
* Called after Distant Horizons finishes loading a new world. <br>
* Note: this may be fired before Minecraft has loaded in the player.
*
* @see IDhApiWorldProxy
*
* @author James Seibel
* @version 2024-12-7
* @since API 4.0.0
*/
public abstract class DhApiWorldLoadEvent implements IDhApiEvent<DhApiWorldLoadEvent.EventParam>
{
/** Fired after Distant Horizons loads a new world. */
public abstract void onWorldLoad(DhApiEventParam<EventParam> input);
//=========================//
// internal DH API methods //
//=========================//
@Override
public final void fireEvent(DhApiEventParam<EventParam> input) { this.onWorldLoad(input); }
//==================//
// parameter object //
//==================//
public static class EventParam implements IDhApiEventParam
{
public EventParam() { }
@Override
public EventParam copy() { return new EventParam(); }
}
}
@@ -0,0 +1,63 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.api.methods.events.abstractEvents;
import com.seibel.distanthorizons.api.interfaces.world.IDhApiWorldProxy;
import com.seibel.distanthorizons.api.methods.events.interfaces.IDhApiEvent;
import com.seibel.distanthorizons.api.methods.events.interfaces.IDhApiEventParam;
import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiEventParam;
/**
* Called after Distant Horizons has finished unloading a world.
*
* @see IDhApiWorldProxy
*
* @author James Seibel
* @version 2024-12-7
* @since API 4.0.0
*/
public abstract class DhApiWorldUnloadEvent implements IDhApiEvent<DhApiWorldUnloadEvent.EventParam>
{
/** Fired before Distant Horizons unloads a world. */
public abstract void onWorldUnload(DhApiEventParam<EventParam> input);
//=========================//
// internal DH API methods //
//=========================//
@Override
public final void fireEvent(DhApiEventParam<EventParam> input) { this.onWorldUnload(input); }
//==================//
// parameter object //
//==================//
public static class EventParam implements IDhApiEventParam
{
public EventParam() { }
@Override
public DhApiWorldLoadEvent.EventParam copy() { return new DhApiWorldLoadEvent.EventParam(); }
}
}
@@ -0,0 +1,45 @@
package com.seibel.distanthorizons.api.objects.data;
import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
import java.util.List;
/**
* Represents a single full LOD backed by Distant Horizons' ID system.
*
* @see IDhApiWorldGenerator
* @since API 4.0.0
*/
public interface IDhApiFullDataSource
{
/** @return how many data columns wide this data source is */
int getWidthInDataColumns();
/**
* Sets the data column at the relative X and Z position to the list given.
* The given list may be resorted based on the internal format DH requires.
*
* @param relX can be in the range 0 to {@link IDhApiFullDataSource#getWidthInDataColumns()}-1 (both inclusive)
* @param relZ can be in the range 0 to {@link IDhApiFullDataSource#getWidthInDataColumns()}-1 (both inclusive)
*
* @return the same columnDataPoints list after it has been imported into the data source.
* The returned list and contained objects can then be re-used.
*
* @throws IndexOutOfBoundsException if the relative positions are negative or outside the bounds of this data source.
*/
List<DhApiTerrainDataPoint> setApiDataPointColumn(int relX, int relZ, List<DhApiTerrainDataPoint> columnDataPoints)
throws IndexOutOfBoundsException, IllegalArgumentException;
/**
* @param relX can be in the range 0 to {@link IDhApiFullDataSource#getWidthInDataColumns()}-1 (both inclusive)
* @param relZ can be in the range 0 to {@link IDhApiFullDataSource#getWidthInDataColumns()}-1 (both inclusive)
*
* @return a {@link List} of {@link DhApiTerrainDataPoint} representing the data for the given relative position.
*
* @throws IndexOutOfBoundsException if the relative positions are negative or outside the bounds of this data source.
*/
List<DhApiTerrainDataPoint> getApiDataPointColumn(int relX, int relZ) throws IndexOutOfBoundsException;
}
@@ -88,25 +88,25 @@ public class DhApiMat4f implements IDhApiCopyable
/** Expects the values of the input array to be in row major order (AKA rows then columns) */
public DhApiMat4f(float[] values)
{
m00 = values[0];
m01 = values[1];
m02 = values[2];
m03 = values[3];
this.m00 = values[0];
this.m01 = values[1];
this.m02 = values[2];
this.m03 = values[3];
m10 = values[4];
m11 = values[5];
m12 = values[6];
m13 = values[7];
this.m10 = values[4];
this.m11 = values[5];
this.m12 = values[6];
this.m13 = values[7];
m20 = values[8];
m21 = values[9];
m22 = values[10];
m23 = values[11];
this.m20 = values[8];
this.m21 = values[9];
this.m22 = values[10];
this.m23 = values[11];
m30 = values[12];
m31 = values[13];
m32 = values[14];
m33 = values[15];
this.m30 = values[12];
this.m31 = values[13];
this.m32 = values[14];
this.m33 = values[15];
}
@@ -31,16 +31,16 @@ public final class ModInfo
public static final String DEDICATED_SERVER_INITIAL_PATH = "dedicated_server_initial";
/** Incremented every time any packets are added, changed or removed, with a few exceptions. */
public static final int PROTOCOL_VERSION = 4;
public static final int PROTOCOL_VERSION = 8;
public static final String WRAPPER_PACKET_PATH = "message";
/** The internal mod name */
public static final String NAME = "DistantHorizons";
/** Human-readable version of NAME */
public static final String READABLE_NAME = "Distant Horizons";
public static final String VERSION = "2.3.0-a-dev";
public static final String VERSION = "2.3.0-b-dev";
/** Returns true if the current build is an unstable developer build, false otherwise. */
public static boolean IS_DEV_BUILD = VERSION.toLowerCase().contains("dev");
public static final boolean IS_DEV_BUILD = VERSION.toLowerCase().contains("dev");
/** This version should only be updated when breaking changes are introduced to the DH API */
public static final int API_MAJOR_VERSION = 4;
@@ -49,7 +49,12 @@ public final class ModInfo
/** This version should be updated whenever non-breaking fixes are added to the DH API */
public static final int API_PATCH_VERSION = 0;
/** If the config file has an older version it'll be re-created from scratch. */
public static final int CONFIG_FILE_VERSION = 3;
/** All DH owned threads should start with this string to allow for easier debugging and profiling. */
public static final String THREAD_NAME_PREFIX = "DH-";
}
@@ -19,7 +19,8 @@
package com.seibel.distanthorizons.coreapi.util;
import java.util.ArrayList;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.Arrays;
/**
@@ -99,4 +100,25 @@ public class StringUtil
}
}
/**
* Source:
* https://stackoverflow.com/questions/3758606/how-can-i-convert-byte-size-into-a-human-readable-format-in-java#3758880
*/
public static String convertBytesToHumanReadable(long bytes)
{
if (-1000 < bytes && bytes < 1000)
{
return bytes + " B";
}
CharacterIterator ci = new StringCharacterIterator("kMGTPE");
while (bytes <= -999_950 || bytes >= 999_950)
{
bytes /= 1000;
ci.next();
}
return String.format("%.1f %cB", bytes / 1000.0, ci.current());
}
}
@@ -0,0 +1,52 @@
/*
* 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.coreapi.util.converters;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiFogDrawMode;
import com.seibel.distanthorizons.coreapi.interfaces.config.IConverter;
/**
* Used for supporting the deprecated {@link EDhApiFogDrawMode}.
*
* @author James Seibel
* @version 2024-10-12
*/
@Deprecated
public class ApiFogDrawModeConverter implements IConverter<Boolean, EDhApiFogDrawMode>
{
@Override
public Boolean convertToCoreType(EDhApiFogDrawMode renderingMode)
{
if (renderingMode == EDhApiFogDrawMode.USE_OPTIFINE_SETTING)
{
return true;
}
else
{
return renderingMode == EDhApiFogDrawMode.FOG_ENABLED;
}
}
@Override
public EDhApiFogDrawMode convertToApiType(Boolean renderingEnabled)
{ return renderingEnabled ? EDhApiFogDrawMode.FOG_ENABLED : EDhApiFogDrawMode.FOG_DISABLED; }
}
@@ -33,9 +33,12 @@ import com.seibel.distanthorizons.core.render.DhApiRenderProxy;
import net.jpountz.lz4.LZ4FrameOutputStream;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.sqlite.SQLiteJDBCLoader;
import org.sqlite.util.OSInfo;
import org.tukaani.xz.XZOutputStream;
import java.awt.*;
import java.io.File;
/** Handles first time Core setup. */
public class Initializer
@@ -57,12 +60,44 @@ public class Initializer
Class<?> config = com.electronwill.nightconfig.core.Config.class;
Class<?> oldFastUtil = it.unimi.dsi.fastutil.longs.LongArrayList.class; // available in 8.2.1
//Class<?> newFastUtil = it.unimi.dsi.fastutil.ints.IntUnaryOperator.class; // available in 8.5.13
Class<?> sqliteJava = org.sqlite.SQLiteConnection.class;
Class<?> sqliteNative = org.sqlite.core.NativeDB.class;
//// maybe these lines are needed to shade SQLite, James isn't sure.
//// Although they never seemed to fail, which is a bit odd.
//try
//{
// // needed by Forge to load the Java database connection
// Class.forName("org.sqlite.JDBC");
// LOGGER.info("loaded normal SQLITE");
//}
//catch (ClassNotFoundException e)
//{
// LOGGER.warn("normal: " + e.getMessage(), e);
//}
//
//try
//{
// // needed by Forge to load the Java database connection
// Class.forName("DistantHorizons.libraries.sqlite.JDBC");
// LOGGER.info("loaded shaded SQLITE");
//}
//catch (ClassNotFoundException e)
//{
// LOGGER.warn("shaded: " + e.getMessage(), e);
//}
boolean sqliteLoaded = SQLiteJDBCLoader.initialize();
if (!sqliteLoaded)
{
throw new RuntimeException("Failed to load SQLite native library. Hopefully SQLite logged a reason for this failure.");
}
}
catch (Throwable e)
{
LOGGER.fatal("Critical programmer error: One or more libraries aren't present. Error: [" + e.getMessage() + "].");
LOGGER.fatal("Critical programmer error: One or more libraries aren't present. Error: [" + e.getMessage() + "].", e);
// throwing here should crash the game, notifying the developer that something is wrong
throw e;
throw new RuntimeException(e);
}
// confirm the resource directory is present
@@ -80,19 +115,21 @@ public class Initializer
throw new RuntimeException(e);
}
if (MC_CLIENT != null)
{
// attempt to set up Swing so we can display dialogs (popup windows)
System.setProperty("java.awt.headless", "false");
if (GraphicsEnvironment.isHeadless())
{
LOGGER.warn("Java.awt.headless is false. This means Distant Horizons can't display error and info dialog windows.");
}
else
{
LOGGER.info("Java.awt.headless set to true. Distant Horizons can correctly display error and info dialog windows.");
}
}
// This code has been disabled since it can cause Mac
// to lock up and refuse the load (there's a bug with Java.awt texture loading)
//if (MC_CLIENT != null)
//{
// // attempt to set up Swing so we can display dialogs (popup windows)
// System.setProperty("java.awt.headless", "false");
// if (GraphicsEnvironment.isHeadless())
// {
// LOGGER.warn("Java.awt.headless is false. This means Distant Horizons can't display error and info dialog windows.");
// }
// else
// {
// LOGGER.info("Java.awt.headless set to true. Distant Horizons can correctly display error and info dialog windows.");
// }
//}
// link Core's config to the API
DhApi.Delayed.configs = DhApiConfig.INSTANCE;
@@ -35,7 +35,7 @@ public class DhApiAmbientOcclusionConfig implements IDhApiAmbientOcclusionConfig
@Override
public IDhApiConfigValue<Boolean> enabled()
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.Ssao.enabled); }
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.Ssao.enableSsao); }
@Override
public IDhApiConfigValue<Integer> sampleCount()
@@ -35,26 +35,26 @@ public class DhApiFarFogConfig implements IDhApiFarFogConfig
@Override
public IDhApiConfigValue<Double> farFogStartDistance()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.farFogStart); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.farFogStart); }
@Override
public IDhApiConfigValue<Double> farFogEndDistance()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.farFogEnd); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.farFogEnd); }
@Override
public IDhApiConfigValue<Double> farFogMinThickness()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.farFogMin); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.farFogMin); }
@Override
public IDhApiConfigValue<Double> farFogMaxThickness()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.farFogMax); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.farFogMax); }
@Override
public IDhApiConfigValue<EDhApiFogFalloff> farFogFalloff()
{ return new DhApiConfigValue<EDhApiFogFalloff, EDhApiFogFalloff>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.farFogFalloff); }
{ return new DhApiConfigValue<EDhApiFogFalloff, EDhApiFogFalloff>(Config.Client.Advanced.Graphics.Fog.farFogFalloff); }
@Override
public IDhApiConfigValue<Double> farFogDensity()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.farFogDensity); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.farFogDensity); }
}
@@ -27,6 +27,7 @@ import com.seibel.distanthorizons.api.interfaces.config.client.IDhApiFogConfig;
import com.seibel.distanthorizons.api.interfaces.config.client.IDhApiHeightFogConfig;
import com.seibel.distanthorizons.api.objects.config.DhApiConfigValue;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.coreapi.util.converters.ApiFogDrawModeConverter;
public class DhApiFogConfig implements IDhApiFogConfig
{
@@ -51,16 +52,26 @@ public class DhApiFogConfig implements IDhApiFogConfig
// basic fog settings //
//====================//
@Deprecated
@Override
public IDhApiConfigValue<EDhApiFogDrawMode> drawMode()
{ return new DhApiConfigValue<>(Config.Client.Advanced.Graphics.Fog.drawMode); }
{ return new DhApiConfigValue<Boolean, EDhApiFogDrawMode>(Config.Client.Advanced.Graphics.Fog.enableDhFog, new ApiFogDrawModeConverter()); }
@Override
public IDhApiConfigValue<Boolean> enableDhFog()
{ return new DhApiConfigValue<>(Config.Client.Advanced.Graphics.Fog.enableDhFog); }
@Override
public IDhApiConfigValue<EDhApiFogColorMode> color()
{ return new DhApiConfigValue<>(Config.Client.Advanced.Graphics.Fog.colorMode); }
@Override
@Deprecated
public IDhApiConfigValue<Boolean> disableVanillaFog()
{ return new DhApiConfigValue<>(Config.Client.Advanced.Graphics.Fog.disableVanillaFog); }
@Override
public IDhApiConfigValue<Boolean> enableVanillaFog()
{ return new DhApiConfigValue<>(Config.Client.Advanced.Graphics.Fog.enableVanillaFog); }
}
@@ -21,7 +21,6 @@ package com.seibel.distanthorizons.core.api.external.methods.config.client;
import com.seibel.distanthorizons.api.interfaces.config.IDhApiConfigValue;
import com.seibel.distanthorizons.api.interfaces.config.client.IDhApiGenericRenderingConfig;
import com.seibel.distanthorizons.api.interfaces.config.client.IDhApiNoiseTextureConfig;
import com.seibel.distanthorizons.api.objects.config.DhApiConfigValue;
import com.seibel.distanthorizons.core.config.Config;
@@ -35,7 +34,7 @@ public class DhApiGenericRenderingConfig implements IDhApiGenericRenderingConfig
@Override
public IDhApiConfigValue<Boolean> renderingEnabled()
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.GenericRendering.enableRendering); }
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.GenericRendering.enableGenericRendering); }
@Override
public IDhApiConfigValue<Boolean> beaconRenderingEnabled()
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.GenericRendering.enableBeaconRendering); }
@@ -109,27 +109,27 @@ public class DhApiGraphicsConfig implements IDhApiGraphicsConfig
@Override
public IDhApiConfigValue<Double> overdrawPreventionRadius()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.AdvancedGraphics.overdrawPrevention); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Culling.overdrawPrevention); }
@Override
public IDhApiConfigValue<Double> brightnessMultiplier()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.AdvancedGraphics.brightnessMultiplier); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Quality.brightnessMultiplier); }
@Override
public IDhApiConfigValue<Double> saturationMultiplier()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.AdvancedGraphics.saturationMultiplier); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Quality.saturationMultiplier); }
@Override
public IDhApiConfigValue<Boolean> caveCullingEnabled()
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.AdvancedGraphics.enableCaveCulling); }
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.Culling.enableCaveCulling); }
@Override
public IDhApiConfigValue<Integer> caveCullingHeight()
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.Graphics.AdvancedGraphics.caveCullingHeight); }
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.Graphics.Culling.caveCullingHeight); }
@Override
public IDhApiConfigValue<Integer> earthCurvatureRatio()
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.Graphics.AdvancedGraphics.earthCurveRatio); }
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.Graphics.Experimental.earthCurveRatio); }
@Override
public IDhApiConfigValue<Boolean> lodOnlyMode()
@@ -137,19 +137,19 @@ public class DhApiGraphicsConfig implements IDhApiGraphicsConfig
@Override
public IDhApiConfigValue<Double> lodBias()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.AdvancedGraphics.lodBias); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Quality.lodBias); }
@Override
public IDhApiConfigValue<EDhApiLodShading> lodShading()
{ return new DhApiConfigValue<EDhApiLodShading, EDhApiLodShading>(Config.Client.Advanced.Graphics.AdvancedGraphics.lodShading); }
{ return new DhApiConfigValue<EDhApiLodShading, EDhApiLodShading>(Config.Client.Advanced.Graphics.Quality.lodShading); }
@Override
public IDhApiConfigValue<Boolean> disableFrustumCulling()
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.AdvancedGraphics.disableFrustumCulling); }
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.Culling.disableFrustumCulling); }
@Override
public IDhApiConfigValue<Boolean> disableShadowFrustumCulling()
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.AdvancedGraphics.disableShadowPassFrustumCulling); }
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.Culling.disableShadowPassFrustumCulling); }
@@ -21,7 +21,7 @@ package com.seibel.distanthorizons.core.api.external.methods.config.client;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiFogFalloff;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogMixMode;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogMode;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogDirection;
import com.seibel.distanthorizons.api.interfaces.config.IDhApiConfigValue;
import com.seibel.distanthorizons.api.interfaces.config.client.IDhApiHeightFogConfig;
import com.seibel.distanthorizons.api.objects.config.DhApiConfigValue;
@@ -37,38 +37,38 @@ public class DhApiHeightFogConfig implements IDhApiHeightFogConfig
@Override
public IDhApiConfigValue<EDhApiHeightFogMixMode> heightFogMixMode()
{ return new DhApiConfigValue<EDhApiHeightFogMixMode, EDhApiHeightFogMixMode>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogMixMode); }
{ return new DhApiConfigValue<EDhApiHeightFogMixMode, EDhApiHeightFogMixMode>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogMixMode); }
@Override
public IDhApiConfigValue<EDhApiHeightFogMode> heightFogMode()
{ return new DhApiConfigValue<EDhApiHeightFogMode, EDhApiHeightFogMode>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogMode); }
public IDhApiConfigValue<EDhApiHeightFogDirection> heightFogDirection()
{ return new DhApiConfigValue<EDhApiHeightFogDirection, EDhApiHeightFogDirection>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogDirection); }
@Override
public IDhApiConfigValue<Double> heightFogBaseHeight()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogBaseHeight); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogBaseHeight); }
@Override
public IDhApiConfigValue<Double> heightFogStartingHeightPercent()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogStart); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogStart); }
@Override
public IDhApiConfigValue<Double> heightFogEndingHeightPercent()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogEnd); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogEnd); }
@Override
public IDhApiConfigValue<Double> heightFogMinThickness()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogMin); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogMin); }
@Override
public IDhApiConfigValue<Double> heightFogMaxThickness()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogMax); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogMax); }
@Override
public IDhApiConfigValue<EDhApiFogFalloff> heightFogFalloff()
{ return new DhApiConfigValue<EDhApiFogFalloff, EDhApiFogFalloff>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogFalloff); }
{ return new DhApiConfigValue<EDhApiFogFalloff, EDhApiFogFalloff>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogFalloff); }
@Override
public IDhApiConfigValue<Double> heightFogDensity()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.AdvancedFog.HeightFog.heightFogDensity); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.Fog.HeightFog.heightFogDensity); }
}
@@ -33,15 +33,13 @@ public class DhApiMultiThreadingConfig implements IDhApiMultiThreadingConfig
@Override
public IDhApiConfigValue<Integer> worldGeneratorThreads()
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.MultiThreading.numberOfWorldGenerationThreads); }
public IDhApiConfigValue<Integer> threadCount()
{ return new DhApiConfigValue<Integer, Integer>(Config.Common.MultiThreading.numberOfThreads); }
@Override
public IDhApiConfigValue<Integer> fileHandlerThreads()
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.MultiThreading.numberOfFileHandlerThreads); }
public IDhApiConfigValue<Double> threadRuntimeRatio()
{ return new DhApiConfigValue<Double, Double>(Config.Common.MultiThreading.threadRunTimeRatio); }
@Override
public IDhApiConfigValue<Integer> lodBuilderThreads()
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.MultiThreading.numberOfLodBuilderThreads); }
}
@@ -36,7 +36,4 @@ public class DhApiMultiplayerConfig implements IDhApiMultiplayerConfig
public IDhApiConfigValue<EDhApiServerFolderNameMode> folderSavingMode()
{ return new DhApiConfigValue<EDhApiServerFolderNameMode, EDhApiServerFolderNameMode>(Config.Client.Advanced.Multiplayer.serverFolderNameMode); }
public IDhApiConfigValue<Double> multiverseSimilarityRequirement()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Multiplayer.multiverseSimilarityRequiredPercent); }
}
@@ -34,18 +34,18 @@ public class DhApiNoiseTextureConfig implements IDhApiNoiseTextureConfig
@Override
public IDhApiConfigValue<Boolean> noiseEnabled()
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseEnabled); }
{ return new DhApiConfigValue<Boolean, Boolean>(Config.Client.Advanced.Graphics.NoiseTexture.enableNoiseTexture); }
@Override
public IDhApiConfigValue<Integer> noiseSteps()
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseSteps); }
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.Graphics.NoiseTexture.noiseSteps); }
@Override
public IDhApiConfigValue<Double> noiseIntensity()
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseIntensity); }
{ return new DhApiConfigValue<Double, Double>(Config.Client.Advanced.Graphics.NoiseTexture.noiseIntensity); }
@Override
public IDhApiConfigValue<Integer> noiseDropoff()
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff); }
{ return new DhApiConfigValue<Integer, Integer>(Config.Client.Advanced.Graphics.NoiseTexture.noiseDropoff); }
}
@@ -22,8 +22,8 @@ package com.seibel.distanthorizons.core.api.external.methods.config.common;
import com.seibel.distanthorizons.api.interfaces.config.IDhApiConfigValue;
import com.seibel.distanthorizons.api.interfaces.config.both.IDhApiWorldGenerationConfig;
import com.seibel.distanthorizons.api.objects.config.DhApiConfigValue;
import com.seibel.distanthorizons.core.config.Config.Client.Advanced.WorldGenerator;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiDistantGeneratorMode;
import com.seibel.distanthorizons.core.config.Config;
/**
* Distant Horizons' world generation configuration. <br><br>
@@ -43,11 +43,11 @@ public class DhApiWorldGenerationConfig implements IDhApiWorldGenerationConfig
@Override
public IDhApiConfigValue<Boolean> enableDistantWorldGeneration()
{ return new DhApiConfigValue<>(WorldGenerator.enableDistantGeneration); }
{ return new DhApiConfigValue<>(Config.Common.WorldGenerator.enableDistantGeneration); }
@Override
public IDhApiConfigValue<EDhApiDistantGeneratorMode> distantGeneratorMode()
{ return new DhApiConfigValue<>(WorldGenerator.distantGeneratorMode); }
{ return new DhApiConfigValue<>(Config.Common.WorldGenerator.distantGeneratorMode); }
}
@@ -33,16 +33,16 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.level.IDhLevel;
import com.seibel.distanthorizons.core.pos.DhLodPos;
import com.seibel.distanthorizons.core.pos.DhSectionPos;
import com.seibel.distanthorizons.core.render.renderer.DebugRenderer;
import com.seibel.distanthorizons.core.util.DhApiTerrainDataPointUtil;
import com.seibel.distanthorizons.core.util.FullDataPointUtil;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.util.RayCastUtil;
import com.seibel.distanthorizons.core.util.math.Vec3f;
import com.seibel.distanthorizons.core.world.AbstractDhWorld;
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.coreapi.util.BitShiftUtil;
import com.seibel.distanthorizons.core.util.math.Vec3d;
@@ -52,6 +52,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
@@ -272,7 +273,7 @@ public class DhApiTerrainDataRepo implements IDhApiTerrainDataRepo
if (!getSpecificYCoordinate)
{
// if we aren't look for a specific datapoint, add each datapoint to the return array
returnArray[i] = generateApiDatapoint(levelWrapper, mapping, requestedDetailLevel, dataPoint);
returnArray[i] = DhApiTerrainDataPointUtil.createApiDatapoint(levelWrapper, mapping, requestedDetailLevel, dataPoint);
}
else
{
@@ -289,7 +290,7 @@ public class DhApiTerrainDataRepo implements IDhApiTerrainDataRepo
if (bottomY <= requestedY && requestedY < topY) // blockPositions start from the bottom of the block, thus "<=" for bottomY, just "<" for topY
{
// this datapoint contains the requested block position, return it
DhApiTerrainDataPoint apiTerrainData = generateApiDatapoint(levelWrapper, mapping, requestedDetailLevel, dataPoint);
DhApiTerrainDataPoint apiTerrainData = DhApiTerrainDataPointUtil.createApiDatapoint(levelWrapper, mapping, requestedDetailLevel, dataPoint);
return DhApiResult.createSuccess(new DhApiTerrainDataPoint[]{apiTerrainData});
}
}
@@ -317,22 +318,6 @@ public class DhApiTerrainDataRepo implements IDhApiTerrainDataRepo
}
}
private static DhApiTerrainDataPoint generateApiDatapoint(IDhApiLevelWrapper levelWrapper, FullDataPointIdMap mapping, byte detailLevel, long dataPoint)
{
IBlockStateWrapper blockState = mapping.getBlockStateWrapper(FullDataPointUtil.getId(dataPoint));
IBiomeWrapper biomeWrapper = mapping.getBiomeWrapper(FullDataPointUtil.getId(dataPoint));
int bottomY = FullDataPointUtil.getBottomY(dataPoint) + levelWrapper.getMinHeight();
int height = FullDataPointUtil.getHeight(dataPoint);
int topY = bottomY + height;
return DhApiTerrainDataPoint.create(
detailLevel,
FullDataPointUtil.getBlockLight(dataPoint), FullDataPointUtil.getSkyLight(dataPoint),
bottomY, topY,
blockState, biomeWrapper);
}
//====================//
@@ -574,6 +559,18 @@ public class DhApiTerrainDataRepo implements IDhApiTerrainDataRepo
LOGGER.info("raycast: [INFINITY]");
}
// draw raycast position
if (rayCast.success && rayCast.payload != null)
{
DebugRenderer.makeParticle(
new DebugRenderer.BoxParticle(
new DebugRenderer.Box(
DhSectionPos.encode((byte) 0, rayCast.payload.pos.x, rayCast.payload.pos.z), rayCast.payload.dataPoint.bottomYBlockPos, rayCast.payload.dataPoint.topYBlockPos, -0.1f, Color.RED),
1.0, 0f
)
);
}
int debugPoint = 0; // a place to put a debugger break point
}
@@ -20,12 +20,15 @@
package com.seibel.distanthorizons.core.api.internal;
import com.seibel.distanthorizons.api.DhApi;
import com.seibel.distanthorizons.api.enums.config.EDhApiMcRenderingFadeMode;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiRenderPass;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.*;
import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam;
import com.seibel.distanthorizons.core.file.structure.ClientOnlySaveStructure;
import com.seibel.distanthorizons.core.network.messages.MessageRegistry;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.render.DhApiRenderProxy;
import com.seibel.distanthorizons.core.render.renderer.FadeRenderer;
import com.seibel.distanthorizons.core.util.TimerUtil;
import com.seibel.distanthorizons.core.util.objects.Pair;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
@@ -140,7 +143,7 @@ public class ClientApi
{
LOGGER.info("Replay on ClientServer mode connecting.");
if (Config.Client.Advanced.Logging.showReplayWarningOnStartup.get())
if (Config.Common.Logging.Warning.showReplayWarningOnStartup.get())
{
MC_CLIENT.sendChatMessage("\u00A76" + "Distant Horizons: Replay detected." + "\u00A7r"); // gold color
MC_CLIENT.sendChatMessage("DH may behave strangely or have missing functionality.");
@@ -205,7 +208,7 @@ public class ClientApi
{
try
{
LOGGER.info("Unloading client level [" + level + "]-["+level.getDimensionName()+"].");
LOGGER.info("Unloading client level [" + level.getClass().getSimpleName() + "]-[" + level.getDhIdentifier() + "].");
if (level instanceof IServerKeyedClientLevel)
{
@@ -216,6 +219,7 @@ public class ClientApi
if (world != null)
{
world.unloadLevel(level);
SharedApi.INSTANCE.clearQueuedChunkUpdates();
ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(level));
}
else
@@ -230,7 +234,7 @@ public class ClientApi
}
}
public void clientLevelLoadEvent(IClientLevelWrapper level)
public void clientLevelLoadEvent(IClientLevelWrapper levelWrapper)
{
// wait a moment before loading the level to give the server a chance to handle the client's login request
if (MC_CLIENT.clientConnectedToDedicatedServer())
@@ -241,7 +245,7 @@ public class ClientApi
this.firstLevelLoadTimer.schedule(new TimerTask()
{
@Override
public void run() { ClientApi.this.clientLevelLoadEvent(level); }
public void run() { ClientApi.this.clientLevelLoadEvent(levelWrapper); }
}, FIRST_LEVEL_LOAD_DELAY_IN_MS);
return;
}
@@ -251,12 +255,12 @@ public class ClientApi
try
{
LOGGER.info("Loading client level [" + level + "]-["+level.getDimensionName()+"].");
LOGGER.info("Loading client level [" + levelWrapper + "]-[" + levelWrapper.getDhIdentifier() + "].");
AbstractDhWorld world = SharedApi.getAbstractDhWorld();
if (world != null)
{
if (!this.pluginChannelApi.allowLevelLoading(level))
if (!this.pluginChannelApi.allowLevelLoading(levelWrapper))
{
LOGGER.info("Levels in this connection are managed by the server, skipping auto-load.");
@@ -266,14 +270,14 @@ public class ClientApi
}
world.getOrLoadLevel(level);
ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelLoadEvent.class, new DhApiLevelLoadEvent.EventParam(level));
world.getOrLoadLevel(levelWrapper);
ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelLoadEvent.class, new DhApiLevelLoadEvent.EventParam(levelWrapper));
this.loadWaitingChunksForLevel(level);
this.loadWaitingChunksForLevel(levelWrapper);
}
else
{
this.waitingClientLevels.add(level);
this.waitingClientLevels.add(levelWrapper);
}
}
catch (Exception e)
@@ -310,28 +314,6 @@ public class ClientApi
// render events //
//===============//
public void rendererShutdownEvent()
{
LOGGER.info("Renderer shutting down.");
IProfilerWrapper profiler = MC_CLIENT.getProfiler();
profiler.push("DH-RendererShutdown");
profiler.pop();
}
public void rendererStartupEvent()
{
LOGGER.info("Renderer starting up.");
IProfilerWrapper profiler = MC_CLIENT.getProfiler();
profiler.push("DH-RendererStartup");
// make sure the GLProxy is created before the LodBufferBuilder needs it
GLProxy.getInstance();
profiler.pop();
}
public void clientTickEvent()
{
IProfilerWrapper profiler = MC_CLIENT.getProfiler();
@@ -375,6 +357,11 @@ public class ClientApi
// networking //
//============//
/**
* Forwards a decoded message into the registered handlers.
*
* @see MessageRegistry
*/
public void pluginMessageReceived(@NotNull AbstractNetworkMessage message)
{
NetworkSession networkSession = this.pluginChannelApi.networkSession;
@@ -450,7 +437,9 @@ public class ClientApi
try
{
if (!RenderUtil.shouldLodsRender(levelWrapper))
// TODO write this message to the F3 menu so people can see when a different mod screws with the lightmap
String reasonLodsCannotRender = RenderUtil.shouldLodsRender(levelWrapper, renderEventParam);
if (reasonLodsCannotRender != null)
{
return;
}
@@ -550,6 +539,32 @@ public class ClientApi
}
}
/** should be called after DH and MC finish rendering so we can smooth the transition between the two */
public void renderFadeOpaque(Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks, IClientLevelWrapper level)
{
// only fade when DH is rendering
if (Config.Client.Advanced.Debugging.rendererMode.get() == EDhApiRendererMode.DEFAULT)
{
if (Config.Client.Advanced.Graphics.Quality.vanillaFadeMode.get() == EDhApiMcRenderingFadeMode.DOUBLE_PASS)
{
FadeRenderer.INSTANCE.render(mcModelViewMatrix, mcProjectionMatrix, partialTicks, level);
}
}
}
/** should be called after DH and MC finish rendering so we can smooth the transition between the two */
public void renderFade(Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks, IClientLevelWrapper level)
{
// only fade when DH is rendering
if (Config.Client.Advanced.Debugging.rendererMode.get() == EDhApiRendererMode.DEFAULT)
{
// fade if any level fading is active
if (Config.Client.Advanced.Graphics.Quality.vanillaFadeMode.get() != EDhApiMcRenderingFadeMode.NONE)
{
FadeRenderer.INSTANCE.render(mcModelViewMatrix, mcProjectionMatrix, partialTicks, level);
}
}
}
@@ -601,7 +616,7 @@ public class ClientApi
}
// memory
if (!this.lowMemoryWarningPrinted && Config.Client.Advanced.Logging.showLowMemoryWarningOnStartup.get())
if (!this.lowMemoryWarningPrinted && Config.Common.Logging.Warning.showLowMemoryWarningOnStartup.get())
{
this.lowMemoryWarningPrinted = true;
@@ -6,7 +6,7 @@ import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager;
import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel;
import com.seibel.distanthorizons.core.logging.ConfigBasedLogger;
import com.seibel.distanthorizons.core.network.event.internal.CloseInternalEvent;
import com.seibel.distanthorizons.core.network.messages.base.CurrentLevelKeyMessage;
import com.seibel.distanthorizons.core.network.messages.base.LevelInitMessage;
import com.seibel.distanthorizons.core.network.session.NetworkSession;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
@@ -23,7 +23,7 @@ import java.util.function.Consumer;
public class ClientPluginChannelApi
{
private static final ConfigBasedLogger LOGGER = new ConfigBasedLogger(LogManager.getLogger(),
() -> Config.Client.Advanced.Logging.logNetworkEvent.get());
() -> Config.Common.Logging.logNetworkEvent.get());
private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
private static final IKeyedClientLevelManager KEYED_CLIENT_LEVEL_MANAGER = SingletonInjector.INSTANCE.get(IKeyedClientLevelManager.class);
@@ -54,8 +54,8 @@ public class ClientPluginChannelApi
/** @return true if the level loading is handled by the server */
public boolean allowLevelLoading(IClientLevelWrapper level)
{
return (KEYED_CLIENT_LEVEL_MANAGER.hasLevelSet() && level instanceof IServerKeyedClientLevel)
|| !KEYED_CLIENT_LEVEL_MANAGER.hasLevelSet();
return (KEYED_CLIENT_LEVEL_MANAGER.isEnabled() && level instanceof IServerKeyedClientLevel)
|| !KEYED_CLIENT_LEVEL_MANAGER.isEnabled();
}
@@ -69,15 +69,13 @@ public class ClientPluginChannelApi
{
Objects.requireNonNull(networkSession);
this.networkSession = networkSession;
this.networkSession.registerHandler(CurrentLevelKeyMessage.class, this::onCurrentLevelKeyMessage);
this.networkSession.registerHandler(LevelInitMessage.class, this::onLevelInitMessage);
this.networkSession.registerHandler(CloseInternalEvent.class, this::onClose);
}
private void onCurrentLevelKeyMessage(CurrentLevelKeyMessage msg)
private void onLevelInitMessage(LevelInitMessage msg)
{
// prefix@namespace:path
// 1-50 characters in total, all parts except namespace can be omitted
if (!msg.levelKey.matches("^(?=.{1,50}$)([a-zA-Z0-9-_]+@)?[a-zA-Z0-9-_]+(:[a-zA-Z0-9-_]+)?$"))
if (!msg.levelKey.matches(LevelInitMessage.VALIDATION_REGEX))
{
throw new IllegalArgumentException("Server sent invalid level key.");
}
@@ -103,7 +101,7 @@ public class ClientPluginChannelApi
}
else
{
LOGGER.info("Unloading non-keyed level: [" + clientLevel.getDimensionName() + "].");
LOGGER.info("Unloading non-keyed level: [" + clientLevel.getDhIdentifier() + "].");
this.levelUnloadHandler.accept(clientLevel);
}
@@ -128,7 +126,7 @@ public class ClientPluginChannelApi
public void reset()
{
this.networkSession = null;
KEYED_CLIENT_LEVEL_MANAGER.clearKeyedLevel();
KEYED_CLIENT_LEVEL_MANAGER.disable();
}
}
@@ -22,12 +22,10 @@ package com.seibel.distanthorizons.core.api.internal;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelLoadEvent;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelUnloadEvent;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import com.seibel.distanthorizons.core.network.messages.MessageRegistry;
import com.seibel.distanthorizons.core.world.*;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import com.seibel.distanthorizons.core.world.AbstractDhWorld;
import com.seibel.distanthorizons.core.world.DhClientServerWorld;
import com.seibel.distanthorizons.core.world.DhServerWorld;
import com.seibel.distanthorizons.core.world.IDhServerWorld;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
@@ -127,6 +125,7 @@ public class ServerApi
if (serverWorld != null)
{
serverWorld.unloadLevel(level);
SharedApi.INSTANCE.clearQueuedChunkUpdates();
ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(level));
}
}
@@ -148,38 +147,63 @@ public class ServerApi
public void serverPlayerJoinEvent(IServerPlayerWrapper player)
{
IDhServerWorld serverWorld = SharedApi.getIDhServerWorld();
if (serverWorld instanceof DhServerWorld) // TODO add support for DhClientServerWorld's (lan worlds) as well
if (DhApiWorldProxy.INSTANCE.worldLoaded() && DhApiWorldProxy.INSTANCE.getReadOnly())
{
LOGGER.info("Player [" + player.getName()+ "] joined.");
((DhServerWorld) serverWorld).addPlayer(player);
return;
}
IDhServerWorld serverWorld = SharedApi.getIDhServerWorld();
LOGGER.info("Player ["+player.getName()+"] joined.");
if (serverWorld != null)
{
serverWorld.addPlayer(player);
}
}
public void serverPlayerDisconnectEvent(IServerPlayerWrapper player)
{
IDhServerWorld serverWorld = SharedApi.getIDhServerWorld();
if (serverWorld instanceof DhServerWorld) // TODO add support for DhClientServerWorld's (lan worlds) as well
if (DhApiWorldProxy.INSTANCE.worldLoaded() && DhApiWorldProxy.INSTANCE.getReadOnly())
{
LOGGER.info("Player [" + player.getName() + "] disconnected.");
((DhServerWorld) serverWorld).removePlayer(player);
return;
}
IDhServerWorld serverWorld = SharedApi.getIDhServerWorld();
LOGGER.info("Player ["+player.getName()+"] disconnected.");
if (serverWorld != null)
{
serverWorld.removePlayer(player);
}
}
public void serverPlayerLevelChangeEvent(IServerPlayerWrapper player, IServerLevelWrapper originLevel, IServerLevelWrapper destinationLevel)
{
IDhServerWorld serverWorld = SharedApi.getIDhServerWorld();
if (serverWorld instanceof DhServerWorld) // TODO add support for DhClientServerWorld's (lan worlds) as well
if (DhApiWorldProxy.INSTANCE.worldLoaded() && DhApiWorldProxy.INSTANCE.getReadOnly())
{
LOGGER.info("Player [" + player.getName() + "] changed level: ["+originLevel.getKeyedLevelDimensionName()+"] -> ["+destinationLevel.getKeyedLevelDimensionName()+"].");
((DhServerWorld) serverWorld).changePlayerLevel(player, originLevel, destinationLevel);
return;
}
IDhServerWorld serverWorld = SharedApi.getIDhServerWorld();
LOGGER.info("Player ["+player.getName()+"] changed level: ["+originLevel.getKeyedLevelDimensionName()+"] -> ["+destinationLevel.getKeyedLevelDimensionName()+"].");
if (serverWorld != null)
{
serverWorld.changePlayerLevel(player, originLevel, destinationLevel);
}
}
/**
* Forwards a decoded message into the registered handlers.
*
* @see MessageRegistry
*/
public void pluginMessageReceived(IServerPlayerWrapper player, @NotNull AbstractNetworkMessage message)
{
IDhServerWorld serverWorld = SharedApi.getIDhServerWorld();
if (serverWorld instanceof DhServerWorld) // TODO add support for DhClientServerWorld's (lan worlds) as well
if (DhApiWorldProxy.INSTANCE.worldLoaded() && DhApiWorldProxy.INSTANCE.getReadOnly())
{
((DhServerWorld) serverWorld).remotePlayerConnectionHandler.handlePluginMessage(player, message);
return;
}
IDhServerWorld serverWorld = SharedApi.getIDhServerWorld();
if (serverWorld != null)
{
serverWorld.getServerPlayerStateManager().handlePluginMessage(player, message);
}
}
@@ -19,6 +19,8 @@
package com.seibel.distanthorizons.core.api.internal;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiWorldLoadEvent;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiWorldUnloadEvent;
import com.seibel.distanthorizons.core.Initializer;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
@@ -32,13 +34,16 @@ import com.seibel.distanthorizons.core.render.renderer.DebugRenderer;
import com.seibel.distanthorizons.core.sql.repo.AbstractDhRepo;
import com.seibel.distanthorizons.core.util.LodUtil;
import com.seibel.distanthorizons.core.util.objects.Pair;
import com.seibel.distanthorizons.core.util.threading.PriorityTaskPicker;
import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil;
import com.seibel.distanthorizons.core.world.*;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;
@@ -52,16 +57,28 @@ public class SharedApi
public static final SharedApi INSTANCE = new SharedApi();
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
/** will be null on the server-side */
@Nullable
private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class);
/** will be null on the server-side */
@Nullable
private static final IMinecraftClientWrapper MC_CLIENT = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
private static final IMinecraftSharedWrapper MC_SHARED = SingletonInjector.INSTANCE.get(IMinecraftSharedWrapper.class);
private static final UpdateChunkPosManager UPDATE_POS_MANAGER = new UpdateChunkPosManager();
/** how many chunks can be queued for updating per thread, used to prevent updates from infinitely pilling up if the user flies around extremely fast */
private static final int MAX_UPDATING_CHUNK_COUNT_PER_THREAD = 500;
/**
* how many chunks can be queued for updating per thread + player (in multiplayer),
* used to prevent updates from infinitely pilling up if the user flies around extremely fast
*/
private static final int MAX_UPDATING_CHUNK_COUNT_PER_THREAD_AND_PLAYER = 1_000;
/** how many milliseconds must pass before an overloaded message can be sent in chat or the log */
private static final int MIN_MS_BETWEEN_OVERLOADED_LOG_MESSAGE = 30_000;
private static AbstractDhWorld currentWorld;
private static int lastWorldGenTickDelta = 0;
private static long lastOverloadedLogMessageMsTime = 0;
@@ -89,12 +106,19 @@ public class SharedApi
if (currentWorld != null)
{
ThreadPoolUtil.setupThreadPools();
ApiEventInjector.INSTANCE.fireAllEvents(DhApiWorldLoadEvent.class, new DhApiWorldLoadEvent.EventParam());
}
else
{
ThreadPoolUtil.shutdownThreadPools();
DebugRenderer.clearRenderables();
MC_RENDER.clearTargetFrameBuffer();
if (MC_RENDER != null)
{
MC_RENDER.clearTargetFrameBuffer();
}
// shouldn't be necessary, but if we missed closing one of the connections this should make sure they're all closed
AbstractDhRepo.closeAllConnections();
// needs to be closed on world shutdown to clear out un-processed chunks
@@ -102,6 +126,11 @@ public class SharedApi
// recommend that the garbage collector cleans up any objects from the old world and thread pools
System.gc();
ApiEventInjector.INSTANCE.fireAllEvents(DhApiWorldUnloadEvent.class, new DhApiWorldUnloadEvent.EventParam());
// fired after the unload event so API users can't change the read-only for any new worlds
DhApiWorldProxy.INSTANCE.setReadOnly(false, false);
}
}
@@ -117,11 +146,11 @@ public class SharedApi
public static AbstractDhWorld getAbstractDhWorld() { return currentWorld; }
/** returns null if the {@link SharedApi#currentWorld} isn't a {@link DhClientServerWorld} */
public static DhClientServerWorld getDhClientServerWorld() { return (currentWorld != null && DhClientServerWorld.class.isInstance(currentWorld)) ? (DhClientServerWorld) currentWorld : null; }
public static DhClientServerWorld getDhClientServerWorld() { return (currentWorld instanceof DhClientServerWorld) ? (DhClientServerWorld) currentWorld : null; }
/** returns null if the {@link SharedApi#currentWorld} isn't a {@link DhClientWorld} or {@link DhClientServerWorld} */
public static IDhClientWorld getIDhClientWorld() { return (currentWorld != null && IDhClientWorld.class.isInstance(currentWorld)) ? (IDhClientWorld) currentWorld : null; }
public static IDhClientWorld getIDhClientWorld() { return (currentWorld instanceof IDhClientWorld) ? (IDhClientWorld) currentWorld : null; }
/** returns null if the {@link SharedApi#currentWorld} isn't a {@link DhServerWorld} or {@link DhClientServerWorld} */
public static IDhServerWorld getIDhServerWorld() { return (currentWorld != null && IDhServerWorld.class.isInstance(currentWorld)) ? (IDhServerWorld) currentWorld : null; }
public static IDhServerWorld getIDhServerWorld() { return (currentWorld instanceof IDhServerWorld) ? (IDhServerWorld) currentWorld : null; }
@@ -139,6 +168,15 @@ public class SharedApi
public static boolean isChunkAtChunkPosAlreadyUpdating(int chunkPosX, int chunkPosZ)
{ return UPDATE_POS_MANAGER.contains(new DhChunkPos(chunkPosX, chunkPosZ)); }
/**
* This is often fired when unloading a level.
* This is done to prevent overloading the system when
* rapidly changing dimensions.
* (IE prevent DH from infinitely allocating memory
*/
public void clearQueuedChunkUpdates() { UPDATE_POS_MANAGER.clear(); }
/** handles both block place and break events */
public void chunkBlockChangedEvent(IChunkWrapper chunk, ILevelWrapper level) { this.applyChunkUpdate(chunk, level, true); }
@@ -170,6 +208,13 @@ public class SharedApi
return;
}
// ignore updates if the world is read-only
if (DhApiWorldProxy.INSTANCE.getReadOnly())
{
return;
}
// only continue if the level is loaded
IDhLevel dhLevel = dhWorld.getLevel(level);
if (dhLevel == null)
@@ -184,6 +229,13 @@ public class SharedApi
return;
}
// shoudln't normally happen, but just in case
if (UPDATE_POS_MANAGER.contains(chunkWrapper.getChunkPos()))
{
// TODO this will prevent some LODs from updating across dimensions if multiple levels are loaded
return;
}
//===============================//
@@ -198,58 +250,103 @@ public class SharedApi
}
else
{
// update the center and any existing neighbour chunks.
// update the center with any existing neighbour chunks.
// this is done so lighting changes are propagated correctly
// get the neighboring chunk list
ArrayList<IChunkWrapper> neighbourChunkList = new ArrayList<>(9);
for (int xOffset = -1; xOffset <= 1; xOffset++)
queueChunkUpdate(chunkWrapper, getNeighbourChunkListForChunk(chunkWrapper,dhLevel), dhLevel);
}
}
private static ArrayList<IChunkWrapper> getNeighbourChunkListForChunk(IChunkWrapper chunkWrapper, IDhLevel dhLevel)
{
// get the neighboring chunk list
ArrayList<IChunkWrapper> neighbourChunkList = new ArrayList<>(9);
for (int xOffset = -1; xOffset <= 1; xOffset++)
{
for (int zOffset = -1; zOffset <= 1; zOffset++)
{
for (int zOffset = -1; zOffset <= 1; zOffset++)
if (xOffset == 0 && zOffset == 0)
{
if (xOffset == 0 && zOffset == 0)
// center chunk
neighbourChunkList.add(chunkWrapper);
}
else
{
// neighboring chunk
DhChunkPos neighbourPos = new DhChunkPos(chunkWrapper.getChunkPos().getX() + xOffset, chunkWrapper.getChunkPos().getZ() + zOffset);
IChunkWrapper neighbourChunk = dhLevel.getLevelWrapper().tryGetChunk(neighbourPos);
if (neighbourChunk != null)
{
// center chunk
neighbourChunkList.add(chunkWrapper);
}
else
{
// neighboring chunk
DhChunkPos neighbourPos = new DhChunkPos(chunkWrapper.getChunkPos().getX() + xOffset, chunkWrapper.getChunkPos().getZ() + zOffset);
IChunkWrapper neighbourChunk = dhLevel.getLevelWrapper().tryGetChunk(neighbourPos);
if (neighbourChunk != null)
{
neighbourChunkList.add(neighbourChunk);
}
neighbourChunkList.add(neighbourChunk);
}
}
}
// light and send the chunks
for (IChunkWrapper litChunk : neighbourChunkList)
{
queueChunkUpdate(litChunk, neighbourChunkList, dhLevel);
}
}
return neighbourChunkList;
}
private static void queueChunkUpdate(IChunkWrapper chunkWrapper, @Nullable ArrayList<IChunkWrapper> neighbourChunkList, IDhLevel dhLevel)
private static void queueChunkUpdate(IChunkWrapper chunkWrapper, @Nullable ArrayList<IChunkWrapper> neighbourChunkList, IDhLevel dhLevel)
{ queueChunkUpdate(chunkWrapper, neighbourChunkList, dhLevel,false); }
private static void queueChunkUpdate(IChunkWrapper chunkWrapper, @Nullable ArrayList<IChunkWrapper> neighbourChunkList, IDhLevel dhLevel, boolean lightUpdateOnly)
{
int maxUpdateSizeMultiplier;
if (MC_CLIENT != null && MC_CLIENT.playerExists())
{
// Local worlds & multiplayer
UPDATE_POS_MANAGER.setCenter(MC_CLIENT.getPlayerChunkPos());
UPDATE_POS_MANAGER.maxSize = MAX_UPDATING_CHUNK_COUNT_PER_THREAD * Config.Client.Advanced.MultiThreading.numberOfLodBuilderThreads.get();
maxUpdateSizeMultiplier = MC_CLIENT.clientConnectedToDedicatedServer() ? 1 : MC_SHARED.getPlayerCount();
}
else
{
// Dedicated servers
// Also includes spawn chunks since they're likely to be intentionally utilized with updates
maxUpdateSizeMultiplier = 1 + MC_SHARED.getPlayerCount();
}
UpdateChunkData updateData = new UpdateChunkData(chunkWrapper, neighbourChunkList, dhLevel);
UPDATE_POS_MANAGER.addItem(chunkWrapper.getChunkPos(), updateData);
UPDATE_POS_MANAGER.maxSize = MAX_UPDATING_CHUNK_COUNT_PER_THREAD_AND_PLAYER
* Config.Common.MultiThreading.numberOfThreads.get()
* maxUpdateSizeMultiplier;
UpdateChunkData updateData = new UpdateChunkData(chunkWrapper, neighbourChunkList, dhLevel, lightUpdateOnly);
if(lightUpdateOnly)
{
UPDATE_POS_MANAGER.removeItem(chunkWrapper.getChunkPos());
}
int remainingCapacity = UPDATE_POS_MANAGER.addItem(chunkWrapper.getChunkPos(), updateData);
if (remainingCapacity <= 0)
{
// limit how often an overloaded message can be sent
long msBetweenLastLog = System.currentTimeMillis() - lastOverloadedLogMessageMsTime;
if (msBetweenLastLog >= MIN_MS_BETWEEN_OVERLOADED_LOG_MESSAGE)
{
lastOverloadedLogMessageMsTime = System.currentTimeMillis();
String message = "\u00A76" + "Distant Horizons overloaded, too many chunks queued for LOD processing. " + "\u00A7r" +
"\nThis may result in holes in your LODs. " +
"\nFix: move through the world slower, decrease your vanilla render distance, slow down your world pre-generator (IE Chunky), or increase the Distant Horizons' CPU thread counts. " +
"\nMax queue count ["+UPDATE_POS_MANAGER.maxSize+"] (["+ MAX_UPDATING_CHUNK_COUNT_PER_THREAD_AND_PLAYER +"] per thread+players).";
boolean showWarningInChat = Config.Common.Logging.Warning.showUpdateQueueOverloadedChatWarning.get();
if (showWarningInChat)
{
ClientApi.INSTANCE.showChatMessageNextFrame(message);
}
// Don't log warnings in singleplayer or in hosted LAN since it usually isn't a problem (and if it is it's easy to notice).
// Servers should always log since being overloaded is harder to notice.
EWorldEnvironment environment = SharedApi.getEnvironment();
if (showWarningInChat || environment == EWorldEnvironment.SERVER_ONLY)
{
LOGGER.warn(message);
}
}
}
// queue updates up to the number of CPU cores allocated for the job
// (this prevents doing extra work queuing tasks that may not be necessary)
// and makes sure the chunks closest to the player are updated first
ThreadPoolExecutor executor = ThreadPoolUtil.getChunkToLodBuilderExecutor();
if (executor != null && executor.getQueue().size() < executor.getCorePoolSize())
PriorityTaskPicker.Executor executor = ThreadPoolUtil.getChunkToLodBuilderExecutor();
if (executor != null && executor.getQueueSize() < executor.getPoolSize())
{
try
{
@@ -261,10 +358,6 @@ public class SharedApi
}
}
}
/** returning a {@link CompletableFuture} isn't necessary, but allows Intellij to properly show the full stack trace when debugging. */
@SuppressWarnings("UnusedReturnValue")
private static void processQueuedChunkUpdate()
{
//LOGGER.trace(chunkWrapper.getChunkPos() + " " + executor.getActiveCount() + " / " + executor.getQueue().size() + " - " + executor.getCompletedTaskCount());
@@ -282,24 +375,19 @@ public class SharedApi
try
{
boolean checkChunkHash = !Config.Client.Advanced.LodBuilding.disableUnchangedChunkCheck.get();
boolean checkChunkHash = !Config.Common.LodBuilding.disableUnchangedChunkCheck.get();
// check if this chunk has been converted into an LOD already
int oldChunkHash = dhLevel.getChunkHash(chunkWrapper.getChunkPos()); // shouldn't happen on the render thread since it may take a few moments to run
int newChunkHash = chunkWrapper.getBlockBiomeHashCode();
if (checkChunkHash)
{
if (oldChunkHash == newChunkHash)
if (oldChunkHash == newChunkHash && !updateData.lightUpdateOnly)
{
// if the chunk hashes are the same then we don't need to bother with lighting the chunk
// or creating/updating the LODs
//LOGGER.info("skipping: "+chunkWrapper.getChunkPos()+" "+newChunkHash);
return;
}
else
{
//LOGGER.info("g: "+chunkWrapper.getChunkPos()+" "+newChunkHash);
}
}
@@ -315,6 +403,22 @@ public class SharedApi
nearbyChunkList.add(chunkWrapper);
}
// if this chunk will update its lighting
// then queue adjacent chunks to update theirs as well
// adjacent chunk will have 'lightUpdateOnly' true
// so they won't schedule further chunk updates
if (!updateData.lightUpdateOnly)
{
for (IChunkWrapper adjacentChunk : nearbyChunkList)
{
// pulling a new chunkWrapper is necessary to prevent concurrent modification on the existing chunkWrappers
IChunkWrapper newCenterChunk = dhLevel.getLevelWrapper().tryGetChunk(adjacentChunk.getChunkPos());
if (newCenterChunk != null)
{
queueChunkUpdate(newCenterChunk, getNeighbourChunkListForChunk(newCenterChunk, dhLevel), dhLevel, true);
}
}
}
// sky lighting is populated later at the data source level
DhLightingEngine.INSTANCE.bakeChunkBlockLighting(chunkWrapper, nearbyChunkList, dhLevel.hasSkyLight() ? LodUtil.MAX_MC_LIGHT : LodUtil.MIN_MC_LIGHT);
@@ -329,8 +433,8 @@ public class SharedApi
finally
{
// queue the next position if there are still positions to process
ThreadPoolExecutor executor = ThreadPoolUtil.getChunkToLodBuilderExecutor();
if (executor != null && !UPDATE_POS_MANAGER.positionMap.isEmpty())
AbstractExecutorService executor = ThreadPoolUtil.getChunkToLodBuilderExecutor();
if (executor != null && !UPDATE_POS_MANAGER.updateDataByChunkPos.isEmpty())
{
try
{
@@ -370,12 +474,15 @@ public class SharedApi
@Nullable
public ArrayList<IChunkWrapper> neighbourChunkList;
public IDhLevel dhLevel;
/** adjacent chunks will only update their light */
public boolean lightUpdateOnly;
public UpdateChunkData(IChunkWrapper chunkWrapper, @Nullable ArrayList<IChunkWrapper> neighbourChunkList, IDhLevel dhLevel)
public UpdateChunkData(IChunkWrapper chunkWrapper, @Nullable ArrayList<IChunkWrapper> neighbourChunkList, IDhLevel dhLevel, boolean lightUpdateOnly)
{
this.chunkWrapper = chunkWrapper;
this.neighbourChunkList = neighbourChunkList;
this.dhLevel = dhLevel;
this.lightUpdateOnly = lightUpdateOnly;
}
}
@@ -384,7 +491,7 @@ public class SharedApi
{
private final PriorityQueue<DhChunkPos> closestQueue;
private final PriorityQueue<DhChunkPos> furthestQueue;
private final HashMap<DhChunkPos, UpdateChunkData> positionMap;
private final HashMap<DhChunkPos, UpdateChunkData> updateDataByChunkPos;
private final ReentrantLock lock = new ReentrantLock();
@@ -401,7 +508,7 @@ public class SharedApi
{
this.closestQueue = new PriorityQueue<>(Comparator.comparingDouble(pos -> pos.squaredDistance(this.center)));
this.furthestQueue = new PriorityQueue<>(Comparator.comparingDouble(pos -> ((DhChunkPos)pos).squaredDistance(this.center)).reversed());
this.positionMap = new HashMap<>();
this.updateDataByChunkPos = new HashMap<>();
// defaulting to 0,0 is fine since it'll be updated once we start adding items
this.center = new DhChunkPos(0, 0);
}
@@ -418,7 +525,7 @@ public class SharedApi
{
this.lock.lock();
return this.positionMap.containsKey(pos);
return this.updateDataByChunkPos.containsKey(pos);
}
finally
{
@@ -432,7 +539,7 @@ public class SharedApi
{
this.lock.lock();
this.positionMap.clear();
this.updateDataByChunkPos.clear();
this.closestQueue.clear();
this.furthestQueue.clear();
}
@@ -442,28 +549,54 @@ public class SharedApi
}
}
public void addItem(DhChunkPos pos, UpdateChunkData updateData)
public void removeItem(DhChunkPos pos)
{
try
{
this.lock.lock();
if (this.positionMap.containsKey(pos))
this.updateDataByChunkPos.remove(pos);
this.closestQueue.remove(pos);
this.furthestQueue.remove(pos);
}
finally
{
this.lock.unlock();
}
}
/**
* Adds an item to the queue of chunks that need to be updated.
* If there are no more slots, replaces the item furthest from the center.
*
* @return The number of remaining slots available in the queue.
*/
public int addItem(DhChunkPos pos, UpdateChunkData updateData)
{
try
{
this.lock.lock();
int remainingSlots = this.maxSize - this.updateDataByChunkPos.size();
if (this.updateDataByChunkPos.containsKey(pos))
{
return;
// Chunk is already present in queue, no need to insert
return remainingSlots;
}
if (this.positionMap.size() >= this.maxSize)
// If no slots are left, get one by removing the item furthest from the center
if (remainingSlots <= 0)
{
// Remove item furthest from the center
DhChunkPos furthest = this.furthestQueue.poll();
this.closestQueue.remove(furthest);
this.positionMap.remove(furthest);
this.updateDataByChunkPos.remove(furthest);
}
this.positionMap.put(pos, updateData);
this.updateDataByChunkPos.put(pos, updateData);
this.closestQueue.add(pos);
this.furthestQueue.add(pos);
return remainingSlots;
}
finally
{
@@ -496,7 +629,7 @@ public class SharedApi
// rebuild the priority queues to match the new center
this.closestQueue.clear();
this.furthestQueue.clear();
for (DhChunkPos pos : this.positionMap.keySet())
for (DhChunkPos pos : this.updateDataByChunkPos.keySet())
{
this.closestQueue.add(pos);
this.furthestQueue.add(pos);
@@ -510,18 +643,18 @@ public class SharedApi
public UpdateChunkData popClosest()
{
if (this.closestQueue.isEmpty())
{
return null;
}
try
{
this.lock.lock();
if (this.closestQueue.isEmpty())
{
return null;
}
DhChunkPos closest = this.closestQueue.poll();
this.furthestQueue.remove(closest);
return this.positionMap.remove(closest);
return this.updateDataByChunkPos.remove(closest);
}
finally
{
File diff suppressed because it is too large Load Diff
@@ -24,7 +24,7 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.config.types.AbstractConfigType;
import com.seibel.distanthorizons.core.config.types.ConfigCategory;
import com.seibel.distanthorizons.core.config.types.ConfigEntry;
import com.seibel.distanthorizons.core.config.types.ConfigLinkedEntry;
import com.seibel.distanthorizons.core.config.types.ConfigUiLinkedEntry;
import com.seibel.distanthorizons.core.wrapperInterfaces.config.ILangWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
import org.apache.logging.log4j.LogManager;
@@ -48,7 +48,7 @@ public class ConfigBase
public static ConfigBase INSTANCE;
public ConfigFileHandling configFileINSTANCE;
private final Logger LOGGER;
private final Logger logger;
public final String modID;
public final String modName;
public final int configVersion;
@@ -100,56 +100,56 @@ public class ConfigBase
public final List<AbstractConfigType<?, ?>> entries = new ArrayList<>();
public ConfigBase(String modID, String modName, Class<?> config)
public ConfigBase(String modID, String modName, Class<?> configClass)
{
this(modID, modName, config, getConfigPath(modName), -1);
this(modID, modName, configClass, getConfigPath(modName), -1);
}
public ConfigBase(String modID, String modName, Class<?> config, Path configPath)
public ConfigBase(String modID, String modName, Class<?> configClass, Path configPath)
{
this(modID, modName, config, configPath, -1);
this(modID, modName, configClass, configPath, -1);
}
public ConfigBase(String modID, String modName, Class<?> config, int configVersion)
public ConfigBase(String modID, String modName, Class<?> configClass, int configVersion)
{
this(modID, modName, config, getConfigPath(modName), configVersion);
this(modID, modName, configClass, getConfigPath(modName), configVersion);
}
public ConfigBase(String modID, String modName, Class<?> config, Path configPath, int configVersion)
public ConfigBase(String modID, String modName, Class<?> configClass, Path configPath, int configVersion)
{
this.LOGGER = LogManager.getLogger(this.getClass().getSimpleName() + ", " + modID);
this.logger = LogManager.getLogger(this.getClass().getSimpleName() + ", " + modID);
LOGGER.info("Initialising config for " + modName);
this.logger.info("Initialising config for " + modName);
this.modID = modID;
this.modName = modName;
this.configVersion = configVersion;
initNestedClass(config, ""); // Init root category
this.initNestedClass(configClass, ""); // Init root category
// File handling (load from file)
this.configFileINSTANCE = new ConfigFileHandling(this, configPath);
this.configFileINSTANCE.loadFromFile();
isLoaded = true;
LOGGER.info("Config for " + modName + " initialised");
this.isLoaded = true;
this.logger.info("Config for " + modName + " initialised");
}
private void initNestedClass(Class<?> config, String category)
private void initNestedClass(Class<?> configClass, String category)
{
// Put all the entries in entries
for (Field field : config.getFields())
for (Field field : configClass.getFields())
{
if (AbstractConfigType.class.isAssignableFrom(field.getType()))
{
try
{
entries.add((AbstractConfigType<?, ?>) field.get(field.getType()));
this.entries.add((AbstractConfigType<?, ?>) field.get(field.getType()));
}
catch (IllegalAccessException exception)
{
LOGGER.warn(exception);
this.logger.warn(exception);
}
AbstractConfigType<?, ?> entry = entries.get(entries.size() - 1);
AbstractConfigType<?, ?> entry = this.entries.get(this.entries.size() - 1);
entry.category = category;
entry.name = field.getName();
entry.configBase = this;
@@ -158,9 +158,9 @@ public class ConfigBase
{ // If item is type ConfigEntry
if (!isAcceptableType(entry.getType()))
{
LOGGER.error("Invalid variable type at [" + (category.isEmpty() ? "" : category + ".") + field.getName() + "].");
LOGGER.error("Type [" + entry.getType() + "] is not one of these types [" + acceptableInputs.toString() + "]");
entries.remove(entries.size() - 1); // Delete the entry if it is invalid so the game can still run
this.logger.error("Invalid variable type at [" + (category.isEmpty() ? "" : category + ".") + field.getName() + "].");
this.logger.error("Type [" + entry.getType() + "] is not one of these types [" + acceptableInputs.toString() + "]");
this.entries.remove(this.entries.size() - 1); // Delete the entry if it is invalid so the game can still run
}
}
@@ -171,7 +171,7 @@ public class ConfigBase
((ConfigCategory) entry).destination = entry.getNameWCategory();
if (entry.get() != null)
{
initNestedClass(((ConfigCategory) entry).get(), ((ConfigCategory) entry).getDestination());
this.initNestedClass(((ConfigCategory) entry).get(), ((ConfigCategory) entry).getDestination());
}
}
}
@@ -223,7 +223,7 @@ public class ConfigBase
}
if (!onlyShowNew || langWrapper.langExists(entryPrefix))
{
if (!ConfigLinkedEntry.class.isAssignableFrom(entry.getClass()))
if (!ConfigUiLinkedEntry.class.isAssignableFrom(entry.getClass()))
{ // If it is a linked item, dont generate the base lang
generatedLang += starter
+ entryPrefix
@@ -80,10 +80,10 @@ public class RenderCacheConfigEventHandler
this.blocksToIgnoreChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.blocksToIgnore, (newValue) -> this.refreshRenderDataAfterTimeout());
this.tintWithAvoidedBlocksChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.tintWithAvoidedBlocks, (newValue) -> this.refreshRenderDataAfterTimeout());
this.brightnessMultiplierChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.AdvancedGraphics.brightnessMultiplier, (newValue) -> this.refreshRenderDataAfterTimeout());
this.saturationMultiplierChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.AdvancedGraphics.saturationMultiplier, (newValue) -> this.refreshRenderDataAfterTimeout());
this.lodShadingChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.AdvancedGraphics.lodShading, (newValue) -> this.refreshRenderDataAfterTimeout());
this.grassSideChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.AdvancedGraphics.grassSideRendering, (newValue) -> this.refreshRenderDataAfterTimeout());
this.brightnessMultiplierChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.brightnessMultiplier, (newValue) -> this.refreshRenderDataAfterTimeout());
this.saturationMultiplierChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.saturationMultiplier, (newValue) -> this.refreshRenderDataAfterTimeout());
this.lodShadingChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.lodShading, (newValue) -> this.refreshRenderDataAfterTimeout());
this.grassSideChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.grassSideRendering, (newValue) -> this.refreshRenderDataAfterTimeout());
this.debugRenderingChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Debugging.debugRendering, (newValue) -> this.refreshRenderDataAfterTimeout());
@@ -1,50 +0,0 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020-2023 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.core.config.eventHandlers;
import com.seibel.distanthorizons.core.config.listeners.ConfigChangeListener;
import com.seibel.distanthorizons.core.config.Config;
public class ResetConfigEventHandler
{
public static ResetConfigEventHandler INSTANCE = new ResetConfigEventHandler();
public final ConfigChangeListener<Boolean> configChangeListener;
/** private since we only ever need one handler at a time */
private ResetConfigEventHandler()
{
this.configChangeListener = new ConfigChangeListener<>(Config.Client.ResetConfirmation.resetAllSettings, (resetSettings) -> { doStuff(resetSettings); });
}
private void doStuff(boolean resetSettings)
{
if (!resetSettings)
{
return;
}
Config.Client.ResetConfirmation.resetAllSettings.set(false);
}
}
@@ -46,11 +46,11 @@ public class WorldCurvatureConfigEventHandler implements IConfigListener
@Override
public void onConfigValueSet()
{
int curveRatio = Config.Client.Advanced.Graphics.AdvancedGraphics.earthCurveRatio.get();
int curveRatio = Config.Client.Advanced.Graphics.Experimental.earthCurveRatio.get();
if (curveRatio > 0 && curveRatio < MIN_VALID_CURVE_VALUE)
{
// shouldn't update the UI, otherwise we may end up fighting the user
Config.Client.Advanced.Graphics.AdvancedGraphics.earthCurveRatio.set(MIN_VALID_CURVE_VALUE);
Config.Client.Advanced.Graphics.Experimental.earthCurveRatio.set(MIN_VALID_CURVE_VALUE);
}
}
@@ -21,6 +21,7 @@ package com.seibel.distanthorizons.core.config.eventHandlers.presets;
import com.seibel.distanthorizons.api.enums.config.EDhApiHorizontalQuality;
import com.seibel.distanthorizons.api.enums.config.EDhApiMaxHorizontalResolution;
import com.seibel.distanthorizons.api.enums.config.EDhApiMcRenderingFadeMode;
import com.seibel.distanthorizons.api.enums.config.EDhApiVerticalQuality;
import com.seibel.distanthorizons.api.enums.config.quickOptions.EDhApiQualityPreset;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiTransparency;
@@ -77,7 +78,7 @@ public class RenderQualityPresetConfigEventHandler extends AbstractPresetConfigE
this.put(EDhApiQualityPreset.HIGH, EDhApiTransparency.COMPLETE);
this.put(EDhApiQualityPreset.EXTREME, EDhApiTransparency.COMPLETE);
}});
private final ConfigEntryWithPresetOptions<EDhApiQualityPreset, Boolean> ssaoEnabled = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.Graphics.Ssao.enabled,
private final ConfigEntryWithPresetOptions<EDhApiQualityPreset, Boolean> ssaoEnabled = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.Graphics.Ssao.enableSsao,
new HashMap<EDhApiQualityPreset, Boolean>()
{{
this.put(EDhApiQualityPreset.MINIMUM, false);
@@ -86,6 +87,24 @@ public class RenderQualityPresetConfigEventHandler extends AbstractPresetConfigE
this.put(EDhApiQualityPreset.HIGH, true);
this.put(EDhApiQualityPreset.EXTREME, true);
}});
private final ConfigEntryWithPresetOptions<EDhApiQualityPreset, EDhApiMcRenderingFadeMode> vanillaFade = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.Graphics.Quality.vanillaFadeMode,
new HashMap<EDhApiQualityPreset, EDhApiMcRenderingFadeMode>()
{{
this.put(EDhApiQualityPreset.MINIMUM, EDhApiMcRenderingFadeMode.NONE);
this.put(EDhApiQualityPreset.LOW, EDhApiMcRenderingFadeMode.SINGLE_PASS);
this.put(EDhApiQualityPreset.MEDIUM, EDhApiMcRenderingFadeMode.DOUBLE_PASS);
this.put(EDhApiQualityPreset.HIGH, EDhApiMcRenderingFadeMode.DOUBLE_PASS);
this.put(EDhApiQualityPreset.EXTREME, EDhApiMcRenderingFadeMode.DOUBLE_PASS);
}});
private final ConfigEntryWithPresetOptions<EDhApiQualityPreset, Boolean> dhDither = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.Graphics.Quality.ditherDhFade,
new HashMap<EDhApiQualityPreset, Boolean>()
{{
this.put(EDhApiQualityPreset.MINIMUM, false);
this.put(EDhApiQualityPreset.LOW, true);
this.put(EDhApiQualityPreset.MEDIUM, true);
this.put(EDhApiQualityPreset.HIGH, true);
this.put(EDhApiQualityPreset.EXTREME, true);
}});
@@ -102,6 +121,8 @@ public class RenderQualityPresetConfigEventHandler extends AbstractPresetConfigE
this.configList.add(this.horizontalQuality);
this.configList.add(this.transparency);
this.configList.add(this.ssaoEnabled);
this.configList.add(this.vanillaFade);
this.configList.add(this.dhDither);
for (ConfigEntryWithPresetOptions<EDhApiQualityPreset, ?> config : this.configList)
@@ -40,112 +40,23 @@ public class ThreadPresetConfigEventHandler extends AbstractPresetConfigEventHan
private static final Logger LOGGER = LogManager.getLogger();
public static int getWorldGenDefaultThreadCount() { return getThreadCountByPercent(0.1); }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Integer> worldGenThreadCount = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.numberOfWorldGenerationThreads,
public static int getDefaultThreadCount() { return getThreadCountByPercent(0.5); }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Integer> threadCount = new ConfigEntryWithPresetOptions<>(Config.Common.MultiThreading.numberOfThreads,
new HashMap<EDhApiThreadPreset, Integer>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 1);
this.put(EDhApiThreadPreset.LOW_IMPACT, getWorldGenDefaultThreadCount());
this.put(EDhApiThreadPreset.BALANCED, getThreadCountByPercent(0.15));
this.put(EDhApiThreadPreset.AGGRESSIVE, getThreadCountByPercent(0.25));
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, getThreadCountByPercent(0.5));
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, getThreadCountByPercent(0.1));
this.put(EDhApiThreadPreset.LOW_IMPACT, getThreadCountByPercent(0.25));
this.put(EDhApiThreadPreset.BALANCED, getDefaultThreadCount());
this.put(EDhApiThreadPreset.AGGRESSIVE, getThreadCountByPercent(0.75));
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, getThreadCountByPercent(1.0));
}});
public static double getWorldGenDefaultRunTimeRatio() { return 0.5; }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Double> worldGenRunTime = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.runTimeRatioForWorldGenerationThreads,
public static double getDefaultRunTimeRatio() { return 1.0; }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Double> threadRunTime = new ConfigEntryWithPresetOptions<>(Config.Common.MultiThreading.threadRunTimeRatio,
new HashMap<EDhApiThreadPreset, Double>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 0.1);
this.put(EDhApiThreadPreset.LOW_IMPACT, getWorldGenDefaultRunTimeRatio());
this.put(EDhApiThreadPreset.BALANCED, 0.75);
this.put(EDhApiThreadPreset.AGGRESSIVE, 1.0);
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, 1.0);
}});
public static int getFileHandlerDefaultThreadCount() { return getThreadCountByPercent(0.1); }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Integer> fileHandlerThreadCount = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.numberOfFileHandlerThreads,
new HashMap<EDhApiThreadPreset, Integer>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 1);
this.put(EDhApiThreadPreset.LOW_IMPACT, getFileHandlerDefaultThreadCount());
this.put(EDhApiThreadPreset.BALANCED, getThreadCountByPercent(0.2));
this.put(EDhApiThreadPreset.AGGRESSIVE, getThreadCountByPercent(0.2));
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, getThreadCountByPercent(0.5));
}});
public static double getFileHandlerDefaultRunTimeRatio() { return 0.5; }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Double> fileHandlerRunTime = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.runTimeRatioForFileHandlerThreads,
new HashMap<EDhApiThreadPreset, Double>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 0.25);
this.put(EDhApiThreadPreset.LOW_IMPACT, getFileHandlerDefaultRunTimeRatio());
this.put(EDhApiThreadPreset.BALANCED, 1.0);
this.put(EDhApiThreadPreset.AGGRESSIVE, 1.0);
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, 1.0);
}});
public static int getUpdatePropagatorDefaultThreadCount() { return getThreadCountByPercent(0.10); }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Integer> UpdatePropagatorThreadCount = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.numberOfUpdatePropagatorThreads,
new HashMap<EDhApiThreadPreset, Integer>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 1);
this.put(EDhApiThreadPreset.LOW_IMPACT, getUpdatePropagatorDefaultThreadCount());
this.put(EDhApiThreadPreset.BALANCED, getThreadCountByPercent(0.25));
this.put(EDhApiThreadPreset.AGGRESSIVE, getThreadCountByPercent(0.50));
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, getThreadCountByPercent(0.75));
}});
public static double getUpdatePropagatorDefaultRunTimeRatio() { return 0.25; }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Double> UpdatePropagatorRunTime = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.runTimeRatioForUpdatePropagatorThreads,
new HashMap<EDhApiThreadPreset, Double>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 0.1);
this.put(EDhApiThreadPreset.LOW_IMPACT, getUpdatePropagatorDefaultRunTimeRatio());
this.put(EDhApiThreadPreset.BALANCED, 0.50);
this.put(EDhApiThreadPreset.AGGRESSIVE, 0.75);
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, 1.0);
}});
public static int getLodBuilderDefaultThreadCount() { return getThreadCountByPercent(0.1); }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Integer> lodBuilderThreadCount = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.numberOfLodBuilderThreads,
new HashMap<EDhApiThreadPreset, Integer>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 1);
this.put(EDhApiThreadPreset.LOW_IMPACT, getLodBuilderDefaultThreadCount());
this.put(EDhApiThreadPreset.BALANCED, getThreadCountByPercent(0.2));
this.put(EDhApiThreadPreset.AGGRESSIVE, getThreadCountByPercent(0.4));
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, getThreadCountByPercent(0.6));
}});
public static double getLodBuilderDefaultRunTimeRatio() { return 0.25; }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Double> lodBuilderRunTime = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.runTimeRatioForLodBuilderThreads,
new HashMap<EDhApiThreadPreset, Double>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 0.1);
this.put(EDhApiThreadPreset.LOW_IMPACT, getLodBuilderDefaultRunTimeRatio());
this.put(EDhApiThreadPreset.BALANCED, 0.5);
this.put(EDhApiThreadPreset.AGGRESSIVE, 0.75);
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, 1.0);
}});
public static int getNetworkCompressionDefaultThreadCount() { return getThreadCountByPercent(0.3); }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Integer> networkCompressionThreadCount = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.numberOfNetworkCompressionThreads,
new HashMap<EDhApiThreadPreset, Integer>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 1);
this.put(EDhApiThreadPreset.LOW_IMPACT, getNetworkCompressionDefaultThreadCount());
this.put(EDhApiThreadPreset.BALANCED, getThreadCountByPercent(0.4));
this.put(EDhApiThreadPreset.AGGRESSIVE, getThreadCountByPercent(0.6));
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, getThreadCountByPercent(0.8));
}});
public static double getNetworkCompressionDefaultRunTimeRatio() { return 0.5; }
private final ConfigEntryWithPresetOptions<EDhApiThreadPreset, Double> networkCompressionRunTime = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.runTimeRatioForNetworkCompressionThreads,
new HashMap<EDhApiThreadPreset, Double>()
{{
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 0.25);
this.put(EDhApiThreadPreset.LOW_IMPACT, getNetworkCompressionDefaultRunTimeRatio());
this.put(EDhApiThreadPreset.BALANCED, 0.75);
this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 0.5);
this.put(EDhApiThreadPreset.LOW_IMPACT, 1.0);
this.put(EDhApiThreadPreset.BALANCED, getDefaultRunTimeRatio());
this.put(EDhApiThreadPreset.AGGRESSIVE, 1.0);
this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, 1.0);
}});
@@ -160,21 +71,8 @@ public class ThreadPresetConfigEventHandler extends AbstractPresetConfigEventHan
private ThreadPresetConfigEventHandler()
{
// add each config used by this preset
this.configList.add(this.worldGenThreadCount);
this.configList.add(this.worldGenRunTime);
this.configList.add(this.fileHandlerThreadCount);
this.configList.add(this.fileHandlerRunTime);
this.configList.add(this.UpdatePropagatorThreadCount);
this.configList.add(this.UpdatePropagatorRunTime);
this.configList.add(this.lodBuilderThreadCount);
this.configList.add(this.lodBuilderRunTime);
this.configList.add(this.networkCompressionThreadCount);
this.configList.add(this.networkCompressionRunTime);
this.configList.add(this.threadCount);
this.configList.add(this.threadRunTime);
for (ConfigEntryWithPresetOptions<EDhApiThreadPreset, ?> config : this.configList)
{
@@ -228,4 +126,6 @@ public class ThreadPresetConfigEventHandler extends AbstractPresetConfigEventHan
@Override
protected EDhApiThreadPreset getCustomPresetEnum() { return EDhApiThreadPreset.CUSTOM; }
}
@@ -20,7 +20,6 @@
package com.seibel.distanthorizons.core.config.file;
import com.electronwill.nightconfig.core.file.CommentedFileConfig;
import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryRelevantSide;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.config.ConfigBase;
import com.seibel.distanthorizons.core.config.types.AbstractConfigType;
@@ -33,6 +32,7 @@ import org.apache.logging.log4j.Logger;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.concurrent.locks.ReentrantLock;
/**
* Handles reading and writing config files.
@@ -53,6 +53,9 @@ public class ConfigFileHandling
/** This is the object for night-config */
private final CommentedFileConfig nightConfig;
/** prevents readers/writers from overlapping and causing the config file from being duplicated or corrupted */
private final ReentrantLock readWriteLock = new ReentrantLock();
//=============//
@@ -72,40 +75,49 @@ public class ConfigFileHandling
/** Saves the entire config to the file */
public void saveToFile()
{
saveToFile(this.nightConfig);
}
public void saveToFile() { this.saveToFile(this.nightConfig); }
/** Saves the entire config to the file */
public void saveToFile(CommentedFileConfig nightConfig)
{
if (!Files.exists(configPath)) // Try to check if the config exists
{
reCreateFile(configPath);
}
loadNightConfig(nightConfig);
for (AbstractConfigType<?, ?> entry : this.configBase.entries)
{
if (ConfigEntry.class.isAssignableFrom(entry.getClass()))
{
createComment((ConfigEntry<?>) entry, nightConfig);
saveEntry((ConfigEntry<?>) entry, nightConfig);
}
}
try
{
nightConfig.save();
this.readWriteLock.lock();
if (!Files.exists(this.configPath)) // Try to check if the config exists
{
reCreateFile(this.configPath);
}
this.loadNightConfig(nightConfig);
for (AbstractConfigType<?, ?> entry : this.configBase.entries)
{
if (ConfigEntry.class.isAssignableFrom(entry.getClass()))
{
this.createComment((ConfigEntry<?>) entry, nightConfig);
this.saveEntry((ConfigEntry<?>) entry, nightConfig);
}
}
try
{
nightConfig.save();
}
catch (Exception e)
{
// If it fails to save, crash game
SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class).crashMinecraft("Failed to save config at [" + this.configPath + "]", e);
}
}
catch (Exception e)
finally
{
// If it fails to save, crash game
SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class).crashMinecraft("Failed to save config at [" + configPath.toString() + "]", e);
this.readWriteLock.unlock();
}
}
@@ -116,69 +128,77 @@ public class ConfigFileHandling
*/
public void loadFromFile()
{
int currentCfgVersion = this.configBase.configVersion;
try
{
// Dont load the real `this.nightConfig`, instead create a tempoary one
CommentedFileConfig tmpNightConfig = CommentedFileConfig.builder(this.configPath.toFile()).build();
tmpNightConfig.load();
// Attempt to get the version number
currentCfgVersion = (Integer) tmpNightConfig.get("_version");
tmpNightConfig.close();
} catch (Exception ignored) { }
if (currentCfgVersion == this.configBase.configVersion)
{
// handle normally
}
else if (currentCfgVersion > this.configBase.configVersion)
{
this.logger.warn("Found config version [" + currentCfgVersion + "] which is newer than current mods config version of [" + this.configBase.configVersion + "]. You may have downgraded the mod and items may have been moved, you have been warned");
}
else // if (currentCfgVersion < configBase.configVersion)
{
this.logger.warn(this.configBase.modName +" config is of an older version, currently there is no config updater... so resetting config");
this.readWriteLock.lock();
int currentCfgVersion = this.configBase.configVersion;
try
{
Files.delete(this.configPath);
// Dont load the real `this.nightConfig`, instead create a tempoary one
CommentedFileConfig tmpNightConfig = CommentedFileConfig.builder(this.configPath.toFile()).build();
tmpNightConfig.load();
// Attempt to get the version number
currentCfgVersion = (Integer) tmpNightConfig.get("_version");
tmpNightConfig.close();
}
catch (Exception e)
catch (Exception ignored) { }
if (currentCfgVersion == this.configBase.configVersion)
{
this.logger.error(e);
// handle normally
}
else if (currentCfgVersion > this.configBase.configVersion)
{
this.logger.warn("Found config version [" + currentCfgVersion + "] which is newer than current mods config version of [" + this.configBase.configVersion + "]. You may have downgraded the mod and items may have been moved, you have been warned");
}
else // if (currentCfgVersion < configBase.configVersion)
{
this.logger.warn(this.configBase.modName + " config is of an older version, currently there is no config updater... so resetting config");
try
{
Files.delete(this.configPath);
}
catch (Exception e)
{
this.logger.error(e);
}
}
this.loadFromFile(this.nightConfig);
this.nightConfig.set("_version", this.configBase.configVersion);
}
finally
{
this.readWriteLock.unlock();
}
this.loadFromFile(this.nightConfig);
this.nightConfig.set("_version", this.configBase.configVersion);
}
/**
* Loads the entire config from the file
*
* @apiNote This overwrites any value currently stored in the config
*/
public void loadFromFile(CommentedFileConfig nightConfig)
private void loadFromFile(CommentedFileConfig nightConfig)
{
// Attempt to load the file and if it fails then save config to file
if (Files.exists(configPath))
if (Files.exists(this.configPath))
{
loadNightConfig(nightConfig);
this.loadNightConfig(nightConfig);
}
else
{
reCreateFile(configPath);
reCreateFile(this.configPath);
}
// Load all the entries
for (AbstractConfigType<?, ?> entry : this.configBase.entries)
{
if (
ConfigEntry.class.isAssignableFrom(entry.getClass()) &&
entry.getAppearance().showInFile
)
if (ConfigEntry.class.isAssignableFrom(entry.getClass())
&& entry.getAppearance().showInFile)
{
createComment((ConfigEntry<?>) entry, nightConfig);
loadEntry((ConfigEntry<?>) entry, nightConfig);
this.createComment((ConfigEntry<?>) entry, nightConfig);
this.loadEntry((ConfigEntry<?>) entry, nightConfig);
}
}
@@ -190,7 +210,7 @@ public class ConfigFileHandling
catch (Exception e)
{
// If it fails to save, crash game
SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class).crashMinecraft("Failed to save config at [" + configPath.toString() + "]", e);
SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class).crashMinecraft("Failed to save config at [" + this.configPath + "]", e);
}
}
@@ -210,13 +230,6 @@ public class ConfigFileHandling
{
return;
}
else if ((entry.getRelevantSide() == EConfigEntryRelevantSide.CLIENT && MC_SHARED.isDedicatedServer())
|| (entry.getRelevantSide() == EConfigEntryRelevantSide.SERVER && !MC_SHARED.isDedicatedServer()))
{
// don't save server/client specific configs on the opposite
// (this keeps the config file clean of unnecessary items)
return;
}
else if (entry.getTrueValue() == null)
{
// TODO when can this happen?
@@ -290,15 +303,6 @@ public class ConfigFileHandling
if ((entry.getRelevantSide() == EConfigEntryRelevantSide.CLIENT && MC_SHARED.isDedicatedServer())
|| (entry.getRelevantSide() == EConfigEntryRelevantSide.SERVER && !MC_SHARED.isDedicatedServer()))
{
// don't save server/client specific configs on the opposite
// (this keeps the config file clean of unnecessary items)
return;
}
String comment = entry.getComment().replaceAll("\n", "\n ").trim();
// the new line makes it easier to read and separate configs
// the space makes sure the first word of a comment isn't directly in line with the "#"
@@ -373,56 +377,4 @@ public class ConfigFileHandling
// ========== API (server) STUFF ========== //
/* * ALWAYS CLEAR WHEN NOT ON SERVER!!!! */
// We are not using this stuff, so comment it out for now (if we ever do need it then we can uncomment it)
/*
@SuppressWarnings("unchecked")
public static void clearApiValues() {
for (AbstractConfigType<?, ?> entry : ConfigBase.entries) {
if (ConfigEntry.class.isAssignableFrom(entry.getClass()) && ((ConfigEntry) entry).allowApiOverride) {
((ConfigEntry) entry).setApiValue(null);
}
}
}
@SuppressWarnings("unchecked")
public static String exportApiValues() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("configVersion", ConfigBase.configVersion);
for (AbstractConfigType<?, ?> entry : ConfigBase.entries) {
if (ConfigEntry.class.isAssignableFrom(entry.getClass()) && ((ConfigEntry) entry).allowApiOverride) {
if (ConfigTypeConverters.convertObjects.containsKey(entry.getType())) {
jsonObject.put(entry.getNameWCategory(), ConfigTypeConverters.convertToString(entry.getType(), ((ConfigEntry<?>) entry).getTrueValue()));
} else {
jsonObject.put(entry.getNameWCategory(), ((ConfigEntry<?>) entry).getTrueValue());
}
}
}
return jsonObject.toJSONString();
}
@SuppressWarnings("unchecked") // Suppress due to its always safe
public static void importApiValues(String values) {
JSONObject jsonObject = null;
try {
jsonObject = (JSONObject) new JSONParser().parse(values);
} catch (ParseException p) {
p.printStackTrace();
}
// Importing code
for (AbstractConfigType<?, ?> entry : ConfigBase.entries) {
if (ConfigEntry.class.isAssignableFrom(entry.getClass()) && ((ConfigEntry) entry).allowApiOverride) {
Object jsonItem = jsonObject.get(entry.getNameWCategory());
if (entry.getType().isEnum()) {
((ConfigEntry) entry).setApiValue(Enum.valueOf((Class<? extends Enum>) entry.getType(), jsonItem.toString()));
} else if (ConfigTypeConverters.convertObjects.containsKey(entry.getType())) {
((ConfigEntry) entry).setApiValue(ConfigTypeConverters.convertFromString(entry.getType(), jsonItem.toString()));
} else {
((ConfigEntry) entry).setApiValue(jsonItem);
}
}
}
}
*/
}
@@ -37,6 +37,9 @@ public class JavaScreenHandlerScreen extends AbstractScreen
static
{
// Note: this code can cause Mac
// to lock up and refuse the load (there's a bug with Java.awt texture loading)
// Needs to be called before any Swing code is called, otherwise
// Swing will get stuck thinking it's headless
System.setProperty("java.awt.headless", "false");
@@ -20,12 +20,12 @@
package com.seibel.distanthorizons.core.config.gui;
import com.seibel.distanthorizons.api.enums.config.EDhApiGpuUploadMethod;
import com.seibel.distanthorizons.core.render.glObject.GLProxy;
import com.seibel.distanthorizons.core.render.glObject.GLState;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.render.glObject.buffer.GLVertexBuffer;
import com.seibel.distanthorizons.core.render.glObject.shader.ShaderProgram;
import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.AbstractVertexAttribute;
import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.VertexPointer;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper;
import org.lwjgl.opengl.GL32;
import java.nio.ByteBuffer;
@@ -36,26 +36,30 @@ import java.nio.ByteOrder;
*/
public class OpenGLConfigScreen extends AbstractScreen
{
ShaderProgram basicShader;
GLVertexBuffer sameContextBuffer;
GLVertexBuffer sharedContextBuffer;
AbstractVertexAttribute va;
private static final IMinecraftGLWrapper GLMC = SingletonInjector.INSTANCE.get(IMinecraftGLWrapper.class);
private ShaderProgram basicShader;
private GLVertexBuffer sameContextBuffer;
private GLVertexBuffer sharedContextBuffer;
private AbstractVertexAttribute va;
@Override
public void init()
{
System.out.println("init");
va = AbstractVertexAttribute.create();
va.bind();
this.va = AbstractVertexAttribute.create();
this.va.bind();
// Pos
va.setVertexAttribute(0, 0, VertexPointer.addVec2Pointer(false));
this.va.setVertexAttribute(0, 0, VertexPointer.addVec2Pointer(false));
// Color
va.setVertexAttribute(0, 1, VertexPointer.addVec4Pointer(false));
va.completeAndCheck(Float.BYTES * 6);
basicShader = new ShaderProgram("shaders/test/vert.vert", "shaders/test/frag.frag",
"fragColor", new String[]{"vPosition", "color"});
createBuffer();
this.va.setVertexAttribute(0, 1, VertexPointer.addVec4Pointer(false));
this.va.completeAndCheck(Float.BYTES * 6);
this.basicShader = new ShaderProgram("shaders/test/vert.vert", "shaders/test/frag.frag",
"fragColor", new String[]{"vPosition", "color"});
this.createBuffer();
}
// Render a square with uv color
@@ -82,8 +86,8 @@ public class OpenGLConfigScreen extends AbstractScreen
private void createBuffer()
{
sharedContextBuffer = createTextingBuffer();
sameContextBuffer = createTextingBuffer();
this.sharedContextBuffer = createTextingBuffer();
this.sameContextBuffer = createTextingBuffer();
}
@Override
@@ -91,40 +95,32 @@ public class OpenGLConfigScreen extends AbstractScreen
{
System.out.println("Updated config screen with the delta of " + delta);
GLState state = new GLState();
GL32.glViewport(0, 0, width, height);
GL32.glViewport(0, 0, this.width, this.height);
GL32.glPolygonMode(GL32.GL_FRONT_AND_BACK, GL32.GL_FILL);
GL32.glDisable(GL32.GL_CULL_FACE);
GL32.glDisable(GL32.GL_DEPTH_TEST);
GL32.glDisable(GL32.GL_STENCIL_TEST);
GL32.glDisable(GL32.GL_BLEND);
//GL32.glDisable(GL32.GL_SCISSOR_TEST);
GLMC.disableFaceCulling();
GLMC.disableDepthTest();
GLMC.disableBlend();
basicShader.bind();
va.bind();
this.basicShader.bind();
this.va.bind();
// Switch between the two buffers per second
if (System.currentTimeMillis() % 2000 < 1000)
{
sameContextBuffer.bind();
va.bindBufferToAllBindingPoints(sameContextBuffer.getId());
this.sameContextBuffer.bind();
this.va.bindBufferToAllBindingPoints(this.sameContextBuffer.getId());
}
else
{
sameContextBuffer.bind();
va.bindBufferToAllBindingPoints(sharedContextBuffer.getId());
this.sameContextBuffer.bind();
this.va.bindBufferToAllBindingPoints(this.sharedContextBuffer.getId());
}
// Render the square
GL32.glDrawArrays(GL32.GL_TRIANGLE_FAN, 0, 4);
GL32.glClear(GL32.GL_DEPTH_BUFFER_BIT);
state.restore();
}
@Override
public void tick()
{
System.out.println("Ticked");
}
public void tick() { System.out.println("Ticked"); }
}
@@ -54,9 +54,9 @@ public class ConfigChangeListener<T> implements IConfigListener, Closeable
public void onConfigValueSet()
{
T newValue = this.configEntry.get();
if (newValue != previousValue)
if (newValue != this.previousValue)
{
previousValue = newValue;
this.previousValue = newValue;
this.onValueChangeFunc.accept(newValue);
}
}
@@ -33,6 +33,7 @@ public abstract class AbstractConfigType<T, S>
public String category = ""; // This should only be set once in the init
public String name; // This should only be set once in the init
protected final T defaultValue;
protected final boolean isFloatingPointNumber;
protected T value;
public ConfigBase configBase;
@@ -40,54 +41,45 @@ public abstract class AbstractConfigType<T, S>
protected EConfigEntryAppearance appearance;
protected AbstractConfigType(EConfigEntryAppearance appearance, T value)
//=============//
// constructor //
//=============//
protected AbstractConfigType(EConfigEntryAppearance appearance, T defaultValue)
{
this.defaultValue = value;
this.value = value;
this.defaultValue = defaultValue;
this.value = defaultValue;
this.appearance = appearance;
Class<?> defaultValueClass = defaultValue.getClass();
this.isFloatingPointNumber = (defaultValueClass == Double.class || defaultValueClass == Float.class);
}
//=========//
// methods //
//=========//
/** Gets the value */
public T get()
{
return this.value;
}
public T get() { return this.value; }
/** Sets the value */
public void set(T newValue)
{
this.value = newValue;
}
public void set(T newValue) { this.value = newValue; }
public EConfigEntryAppearance getAppearance()
{
return appearance;
}
public void setAppearance(EConfigEntryAppearance newAppearance)
{
this.appearance = newAppearance;
}
public EConfigEntryAppearance getAppearance() { return this.appearance; }
public void setAppearance(EConfigEntryAppearance newAppearance) { this.appearance = newAppearance; }
public String getCategory()
{
return this.category;
}
public String getName()
{
return this.name;
}
public String getNameWCategory()
{
return (this.category.isEmpty() ? "" : this.category + ".") + this.name;
}
public String getCategory() { return this.category; }
public String getName() { return this.name; }
public String getNameWCategory() { return (this.category.isEmpty() ? "" : this.category + ".") + this.name; }
// Gets the class of T
public Class<?> getType()
{
return this.defaultValue.getClass();
}
/** Gets the class of T */
public Class<?> getType() { return this.defaultValue.getClass(); }
public boolean typeIsFloatingPointNumber() { return this.isFloatingPointNumber; }
protected static abstract class Builder<T, S>
{

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