Compare commits

..

207 Commits

Author SHA1 Message Date
Zoë Gidiere db930739d7 Merge pull request #545 from TheNick24/dev/1.21.11
feat: update minestom to 1.21.11
2026-04-28 17:47:42 +00:00
Nico Weber 9686372238 feat: update minestom to 1.21.11 2025-12-21 01:41:15 +01:00
Zoe Gidiere 2120dde0db WIP on master 2025-12-19 06:13:44 -07:00
Zoë Gidiere f780450a7c Merge pull request #543 from everbuild-org/feat/minestom-ver-1.21.11
Minestom 1.21.11 Support
2025-12-19 03:09:07 +00:00
Zoe Gidiere e870a9eb8d Merge branch 'master' into dev/1.21.11 2025-12-18 20:07:58 -07:00
Zoe Gidiere c6eb2f49f3 Revert "Merge pull request #538 from ryzech/fix/caffeine-relocate"
This reverts commit 6929de7b61, reversing
changes made to a159debe3e.
2025-12-17 01:20:33 -07:00
Zoë Gidiere 6929de7b61 Merge pull request #538 from ryzech/fix/caffeine-relocate
Relocate caffeine to fix conflicts with other mods/plugins
2025-12-14 16:11:16 +00:00
Zoe Gidiere a159debe3e update publishing config 2025-12-13 17:55:17 -07:00
Zoe Gidiere 99e2907b2d add java doc build 2025-12-13 17:45:47 -07:00
Zoe Gidiere ac71b3ec0c Fix java doc dir 2025-12-13 17:41:21 -07:00
Zoe Gidiere e184937743 WIP Jenkinsfile 2025-12-13 17:34:13 -07:00
Zoe Gidiere 8c155c78eb step arg as min res 2025-12-13 11:35:39 -07:00
Zoe Gidiere fc779e1120 Auto-mode 2025-12-13 11:32:29 -07:00
Zoe Gidiere be964da4fa paper async 2025-12-13 10:48:18 -07:00
Zoe Gidiere 6ca401413b Terra Search Command 2025-12-13 10:34:01 -07:00
Zoe Gidiere e556e2bca1 Update Seismic 2025-12-13 10:33:18 -07:00
Zoe Gidiere 1fc97a480a Small biomechunk allocation opt 2025-12-11 14:44:32 -07:00
Zoe Gidiere bba55f2669 Align TriStateIntCache 2025-12-11 01:56:20 -07:00
Christian Bergschneider e99ae48f1a build: address review comments 2025-12-11 08:55:49 +00:00
Zoe Gidiere 97b4ea6d94 Improve PaddedGridDistributor Performance 2025-12-10 23:17:06 -07:00
Zoe Gidiere cf4f7822e2 Download JavaDocs and Sources in Idea 2025-12-10 23:16:39 -07:00
Zoe Gidiere d6285a5901 Improve TriStateintCache with Unsafe 2025-12-10 22:33:49 -07:00
Christian Bergschneider 2e2b315ab7 ci: bump java version to 25-tem 2025-12-11 03:40:32 +01:00
Christian Bergschneider 04554b886a chore: bump minestom to 1.21.10 2025-12-11 03:39:24 +01:00
Christian Bergschneider d3429626b5 chore: update gradle to version 9.2.1 to allow jvm25 2025-12-11 03:39:18 +01:00
Zoe Gidiere 8b933b0d5c Merge remote-tracking branch 'origin/master' 2025-12-10 19:28:43 -07:00
Zoe Gidiere f9a5dfbfce Update seismic 2025-12-10 19:28:39 -07:00
Zoë Gidiere 24bca3ed98 Merge pull request #542 from everbuild-org/fix/minestom-nbt-additions
Minestom Nbt Support
2025-12-10 18:57:19 -07:00
Zoe Gidiere f8f6b0b4bc Reformat 2025-12-10 18:52:00 -07:00
Zoe Gidiere dd2f0365b0 More Extrusion Opts 2025-12-10 18:49:03 -07:00
Christian Bergschneider ae2d801be0 perf: reduce object churn by swapping to long keys in GeneratedChunkCache 2025-12-11 02:33:40 +01:00
Christian Bergschneider 8578bba7b9 perf: reduce object churn by using minestom block states 2025-12-11 02:00:13 +01:00
Christian Bergschneider d262831107 feat: add basic minestom NBT additions and improve block state parser performance 2025-12-11 01:30:40 +01:00
Zoe Gidiere ddc8cc7db5 Reformat 2025-12-10 02:55:26 -07:00
Zoe Gidiere 12f1b3f8fc Use ASM to to compile extrusion pipelines 2025-12-10 02:54:44 -07:00
Zoe Gidiere dc7c57d1a3 Update seismic 2 2025-12-10 02:18:10 -07:00
OakLoaf 349ce6654c Adjusted list of supported versions 2025-12-09 21:35:09 +00:00
OakLoaf b04156bb45 Started migration to 1.21.11 2025-12-09 21:32:28 +00:00
Zoe Gidiere 309fb5af96 Update Seismic 2025-12-08 13:29:10 -07:00
RyzechDev 9d747aed71 Relocate caffeine to fix conflicts with other mods/plugins 2025-11-19 10:14:22 -06:00
Zoë Gidiere 3cf11a9ad4 Merge pull request #534 from AllayMC/feat/meta-pack
feat: add support for meta pack in allay platform
2025-10-14 13:34:24 -06:00
Zoë Gidiere 9f766b0647 Merge pull request #535 from PolyhedralDev/dev/1.21.10
Cleaned up Bukkit NMS bindings and marked 1.21.10 as supported
2025-10-14 13:33:51 -06:00
daoge_cmd 8fa3978dc8 feat: update resource files 2025-10-14 22:10:35 +08:00
OakLoaf c282e55f90 Adjusted paper dependency 2025-10-13 12:16:43 +01:00
OakLoaf 8b62badbdb Moved nms packages directly into the nms gradle module 2025-10-13 10:49:06 +01:00
OakLoaf 8bceb255c0 Corrected version formatting in supported versions list 2025-10-13 10:40:40 +01:00
OakLoaf ad80769d67 Removed version specific bindings 2025-10-12 22:48:41 +01:00
daoge_cmd 9d0fa0a7c4 Merge branch 'master' into feat/meta-pack 2025-10-10 10:04:15 +08:00
daoge_cmd 8c532ede8e fix: ignore the block when out of bounds 2025-10-10 10:03:01 +08:00
Zoë Gidiere c3d26527a7 parallel pack loading 2025-10-09 17:55:29 -06:00
Zoë Gidiere 1fe56335c8 Remove bufferedimage 2025-10-09 17:38:08 -06:00
Zoë Gidiere 3b377d91ee fix concurrency issues in openregistryimpl 2025-10-09 17:34:06 -06:00
daoge_cmd 0144200ec9 doc: update comment 2025-10-10 00:46:55 +08:00
daoge_cmd d1ad3d04e1 feat: add support for meta pack 2025-10-10 00:30:38 +08:00
Zoë Gidiere d640b49ded Merge pull request #533 from everbuild-org/fix/minestom-platform-fixes
Minestom 1.21.8/9/10 & Metapack support
2025-10-07 23:49:46 -06:00
Zoë Gidiere ecbfd1740c Fabric 1.21.10 2025-10-07 17:55:37 -06:00
Zoe Gidiere dc5952add7 WIP 1.21.10 2025-10-07 17:15:07 -06:00
Christian Bergschneider 1b6ebeb05f fix: improve particle handling and block state retrieval 2025-10-07 23:32:30 +02:00
Christian Bergschneider 234ff3e49c feat: actually do biome preloading 2025-10-07 23:23:54 +02:00
Christian Bergschneider 243c523b57 feat: pre-add biomes to registry to prevent future modifications 2025-10-07 23:06:58 +02:00
Christian Bergschneider 1700650753 feat: add methods to pack by meta and default meta in TerraMinestomWorldBuilder 2025-10-07 22:54:15 +02:00
Christian Bergschneider 12d2221d49 fix: ignore and warn on snbt on particles 2025-10-07 21:38:49 +02:00
Christian Bergschneider 42e1adfc3a chore: update minestom dependency 2025-10-07 21:38:26 +02:00
Zoë Gidiere 4ff91c9fea Revert "Update gradle"
This reverts commit 81bc51f5a1.
2025-10-07 12:53:36 -06:00
Zoe Gidiere 81bc51f5a1 Update gradle 2025-10-07 11:54:36 -06:00
Zoë Gidiere ac98726f81 Cleanup Fabric BlockState and EntityType Extended implementation 2025-10-06 18:12:42 -06:00
Zoë Gidiere 1d2c6d4294 Synchronize pack loading 2025-10-05 23:58:53 -06:00
Zoë Gidiere 9ca7014344 Entity SNBT Support and Cleanup 2025-10-05 23:50:29 -06:00
Zoë Gidiere 8d153998fa Reformat Code 2025-10-05 21:55:16 -06:00
Zoë Gidiere 2b09ed8fd9 Simplify mixin implementations
Refactors mixin implementations to remove unnecessary casting.

This change improves code readability and reduces redundancy by directly accessing methods and fields within the mixin context, rather than relying on casting to the target class.
2025-10-05 21:51:40 -06:00
Zoë Gidiere 96493ede15 Merge remote-tracking branch 'origin/master' 2025-10-05 20:24:25 -06:00
Zoë Gidiere 48586eb523 Fix SNBT writing 2025-10-05 20:23:54 -06:00
Zoë Gidiere a80b94ad45 Unwrap BlockState in Chunk Gen 2025-10-05 17:03:51 -06:00
Zoë Gidiere 089850d633 Support for SNBT in structures 2025-10-05 17:03:45 -06:00
Zoë Gidiere 42f3c56b71 Extended BlockState API 2025-10-05 16:47:12 -06:00
Zoë Gidiere 874ef56025 Update seismic 2025-10-05 16:44:49 -06:00
Zoë Gidiere 06f04005ea Merge pull request #526 from AllayMC/feat/allay-update
feat: update allay-api and resource files
2025-10-04 13:55:02 -06:00
daoge_cmd 774d076f77 build: enable build for allay platform 2025-10-04 17:21:22 +08:00
daoge_cmd e4561bd48f Merge branch 'master' into feat/allay-update
# Conflicts:
#	platforms/allay/src/main/java/com/dfsek/terra/allay/Mapping.java
#	platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayItemHandle.java
2025-10-04 17:19:01 +08:00
daoge_cmd 550a037661 chore: remove unused okaeri maven repo 2025-10-04 17:14:49 +08:00
daoge_cmd 3b25e82a73 feat: use allay-api 0.12.0 2025-10-04 17:14:06 +08:00
Zoë Gidiere 9b3a105672 Fix game metapack loading 2025-10-03 19:07:00 -06:00
Zoë Gidiere 10558b5446 fix typo 2025-10-03 18:24:00 -06:00
Zoë Gidiere 326300bcce update resource logic for metapacks 2025-10-03 18:10:45 -06:00
Zoë Gidiere a7826dec49 add metapacks to default commented ingore list 2025-10-03 17:29:30 -06:00
Zoë Gidiere fd3d1ce830 Change ConstantRage check to only check if greater than 2025-10-03 17:11:12 -06:00
Zoë Gidiere 84a6cd0c26 fix bukkit spawning consistency 2025-10-03 15:49:55 -06:00
Zoë Gidiere d1faac8b96 Pull in remaining packs 2025-10-03 15:27:48 -06:00
Zoë Gidiere de4656d01f new pack name 2025-10-03 14:39:27 -06:00
Zoë Gidiere 6dba2e9394 Use latest OW 2025-10-03 13:59:54 -06:00
Zoë Gidiere 8a8db4a9b8 Merge pull request #445 from PolyhedralDev/dev/7.0-2
Dev/7.0
2025-10-03 01:01:49 -06:00
Zoë Gidiere c1a00ca5c7 reformat 2025-10-03 00:59:43 -06:00
Zoë Gidiere 2b5d613aef fix up 2025-10-03 00:54:53 -06:00
Zoë Gidiere 8bea1d23e0 Merge branch 'master' into dev/7.0-2 2025-10-03 00:51:05 -06:00
Zoë Gidiere fb5e597a11 Merge pull request #532 from PolyhedralDev/dev/1.21.9
Updated to 1.21.9
2025-10-03 00:49:23 -06:00
Zoë Gidiere 0990df0620 Merge branch 'master' into dev/1.21.9 2025-10-03 00:48:43 -06:00
Zoë Gidiere 451683aff5 spooky month (bump version to 6.6.6) 2025-10-03 00:35:24 -06:00
OakLoaf 41e9c2f55f Disabled AllayMC platform 2025-10-02 17:45:21 -06:00
Zoë Gidiere 4873b321cb update fabric build version 2025-10-02 17:33:31 -06:00
OakLoaf 64546bb154 Migrated to modern PaperCommandManager 2025-09-30 19:36:50 +01:00
OakLoaf d97478d2c4 Added separate version definition for runPaper task 2025-09-30 19:36:24 +01:00
OakLoaf 359b4826bc Corrected version in fabric.mod.json 2025-09-30 19:31:34 +01:00
OakLoaf 4b218a65f6 Refactored bukkit nms package 2025-09-30 19:00:36 +01:00
OakLoaf b88712e569 Fixed compilation errors 2025-09-30 18:51:25 +01:00
OakLoaf af509ebc3b Disabled AllayMC platform 2025-09-30 18:43:11 +01:00
OakLoaf a5c3733568 Updated dependencies for 1.21.9 2025-09-30 18:42:58 +01:00
daoge_cmd 3ef60f4b33 feat: adapt allay api 0.12.0-SHAPSHOT (waiting for 0.12.0 release) 2025-09-30 23:12:12 +08:00
daoge_cmd b7864bb6fb feat: use https://github.com/misode/mcmeta to replace the old je_block_default_states.json file (it's renamed to je_blocks.json now). 2025-08-21 11:51:17 +08:00
daoge_cmd 757ed6ad4d feat: update allay-api and mapping files 2025-08-21 00:11:36 +08:00
Zoë Gidiere 1ef12fdec0 Merge pull request #525 from PolyhedralDev/dev/wolves
More wolf fixes
2025-08-13 14:36:50 -06:00
OakLoaf 4e890f96e4 Corrected wolf variant spawn reasons list 2025-08-13 20:22:25 +01:00
OakLoaf 4e70ee99c9 Adjusted log scope 2025-08-13 20:22:03 +01:00
Zoë Gidiere b149497c60 Merge pull request #521 from PolyhedralDev/deps/cloud
Updated cloud-paper to resolve warning message
2025-08-11 21:34:11 -06:00
Zoë Gidiere d9f591bdb4 Merge pull request #524 from PolyhedralDev/dev/wolves
Made wolves generated with chunks correctly inherit variants
2025-08-11 21:34:01 -06:00
Zoë Gidiere a4b74e2e7f Merge pull request #522 from PolyhedralDev/dev/1.21.8
Added 1.21.8 support
2025-08-11 21:33:51 -06:00
OakLoaf b53d475f42 Made wolves generated with chunks correctly inherit variants 2025-08-01 16:53:32 +01:00
OakLoaf 4ddb741d0d Refactored packages for 1.21.8 2025-07-19 18:23:32 +01:00
OakLoaf 852f5aa610 Bumped dependencies 2025-07-18 16:02:54 +01:00
OakLoaf 953895a8d4 Bumped dependencies 2025-07-18 16:00:58 +01:00
OakLoaf 8788eab839 Added 1.21.8 bukkit support 2025-07-17 15:13:01 +01:00
Oak 2b62473372 Update Versions.kt 2025-07-17 14:13:40 +01:00
Zoë Gidiere b9187248c3 Merge remote-tracking branch 'origin/master' into dev/7.0-2 2025-07-13 17:03:38 -06:00
Zoë Gidiere 2d42810ba3 Merge pull request #513 from everbuild-org/fix/minestom-fine-grained-biome
minestom: remove fine-grained biome control from minestom
2025-07-13 16:44:25 -06:00
Zoë Gidiere 9f546370cd Merge pull request #519 from PolyhedralDev/feat/nmsplatform
Fixed NMSPlatform implementation
2025-07-13 16:44:10 -06:00
Zoë Gidiere 428bf341ef Better handling of internal addon 2025-07-13 15:47:48 -06:00
OakLoaf 8a61571ceb Fixed biome registering 2025-07-13 14:48:56 +01:00
OakLoaf b669f87b79 Merge branch 'refs/heads/master' into feat/nmsplatform 2025-07-13 14:22:00 +01:00
OakLoaf e507675ef6 Removed unused import 2025-07-13 14:21:45 +01:00
Zoë Gidiere 0fc2105ee6 update seismic version 2025-07-11 02:10:02 -06:00
Zoë Gidiere 77b077dd47 update seismic to snaphsot 2025-07-10 23:45:05 -06:00
Zoë Gidiere f38fcd03b0 Reformat 2025-07-10 21:53:17 -06:00
Zoë Gidiere af1e9de474 Merge branch 'master' into dev/7.0-2 2025-07-10 19:51:17 -06:00
Zoë Gidiere 3322a16f09 Fix particle releated crash on bukkit 2025-07-10 19:50:54 -06:00
Zoë Gidiere 78707468c5 Merge branch 'master' into dev/7.0-2 2025-07-10 19:44:30 -06:00
Zoë Gidiere c658d1a81b Merge remote-tracking branch 'origin/master' 2025-07-10 19:42:38 -06:00
Zoë Gidiere 56a7234494 Merge pull request #518 from PolyhedralDev/feat/nmsplatform
Implemented vanilla biome config options
2025-07-10 19:40:22 -06:00
Zoë Gidiere 217b708177 Update NMSPlatform.java 2025-07-10 19:40:05 -06:00
OakLoaf 7d86a41f65 Updates to particles 2025-07-10 11:29:31 +01:00
OakLoaf 753574fc9b Implemented vanilla biome config options 2025-07-10 11:14:22 +01:00
Zoë Gidiere 95f89ed2b6 reformat tesf test 2025-07-09 21:59:13 -06:00
Zoë Gidiere cb8aefe8d2 updates to particles 2025-07-09 19:31:48 -06:00
Zoë Gidiere cd8d6f0da3 fix build 2025-07-09 18:02:59 -06:00
Zoë Gidiere d33b75b77b Merge branch 'master' into dev/7.0-2 2025-07-09 16:48:22 -06:00
Zoë Gidiere 79f9488380 Merge pull request #515 from PolyhedralDev/dev/1.21.7
Bumped Cloud for Paper and Fabric version
2025-07-09 16:42:23 -06:00
Zoë Gidiere 4c2ce65cdc Some fixes to biome config 2025-07-09 16:41:53 -06:00
Zoë Gidiere 70c448dd0d Fix particles 2025-07-09 15:06:40 -06:00
Zoë Gidiere 3ad0ef8501 Update Seismic + paralihtic 2025-07-09 14:06:01 -06:00
OakLoaf 060bda2ec1 Bumped cloud-fabric version 2025-07-03 18:21:41 +01:00
Zoë Gidiere 6b60246694 Merge pull request #514 from PolyhedralDev/dev/1.21.7
Update to 1.21.7
2025-06-30 11:13:24 -06:00
OakLoaf 1a1f461550 Corrected version in fabric.mod.json 2025-06-30 17:57:19 +01:00
OakLoaf da20e282ce Updated Fabric to 1.21.7 2025-06-30 17:53:50 +01:00
OakLoaf 9b14b0ee96 Updated Bukkit to 1.21.7 2025-06-30 16:47:29 +01:00
Christian Bergschneider 89cbab071f refactor: remove fine-grained biome controls and adjust biome handling
Removed the deprecated `doFineGrainedBiomes` option from `TerraMinestomWorldBuilder` and associated classes. Updated biome management to use `IdentityHashMap` and added additional tracking for created biomes. Upgraded Minestom version to `1_21_6-a40d7115d4`.
2025-06-30 00:33:42 +02:00
Zoë Gidiere 71953c90a2 optimize imports 2025-06-28 19:05:20 -06:00
Zoë Gidiere 923cb08b37 fix build 2025-06-28 15:52:19 -06:00
Zoë Gidiere 21ef8c0dc4 Update Seismic 2025-06-28 15:47:08 -06:00
Zoë Gidiere 77b1960757 Use seismic func for perf 2 2025-06-28 15:47:02 -06:00
Zoë Gidiere a06c6fd980 Use Seismic function for perf 2025-06-28 15:46:28 -06:00
Zoë Gidiere 46f533ca9d Perf opts 2025-06-25 00:38:24 -06:00
Zoë Gidiere 9a61334f5a Merge branch 'master' into dev/7.0-2 2025-06-24 18:06:02 -06:00
Zoë Gidiere 118aeb872f Merge pull request #511 from PolyhedralDev/dev/wolves
Fixed wolf variant support for Paper platform
2025-06-23 13:17:18 -06:00
OakLoaf 5446b729f9 Finalised wolves 2025-06-19 21:44:24 +01:00
Oak d71c6bb25f Corrected checks 2025-06-19 21:22:06 +01:00
Oak d8524603c6 Implemented wolf variant support 2025-06-19 21:12:24 +01:00
OakLoaf 85234ddc39 Progress on wolves 2025-06-19 20:50:31 +01:00
OakLoaf 78162eaafe Added vanilla biome key to biome context 2025-06-19 20:49:57 +01:00
OakLoaf 7a041d8a63 Removed unused import 2025-06-19 20:49:37 +01:00
Zoë Gidiere 8cfa2e1467 bump version 2025-06-19 12:23:59 -06:00
Zoë Gidiere 5f367c0f2c Merge pull request #510 from PolyhedralDev/dev/multiverse-fix
Fixed issues causing plugin to fail to load if Multiverse is not present
2025-06-19 12:00:07 -06:00
OakLoaf f4db7fc507 Added initial wolf variant support (not functional) 2025-06-19 15:46:46 +01:00
OakLoaf ad9d16f48c Updated biome collection 2025-06-19 15:46:18 +01:00
OakLoaf 85b6dcc891 Moved all code that requires Multiverse imports into MultiverseGeneratorPluginHook 2025-06-19 14:24:04 +01:00
Zoë Gidiere 29691dfb4d Merge pull request #509 from everbuild-org/master
feat: backport latest minestom support from 7.0 branch
2025-06-18 17:49:21 -06:00
Christian Bergschneider 81eab13ce1 feat: backport latest minestom support from 7.0 branch 2025-06-19 01:42:31 +02:00
Zoë Gidiere a79a347765 temp fix tesf test file 2025-06-18 13:10:38 -06:00
Zoë Gidiere 46e603d681 Reformat 2025-06-18 11:43:35 -06:00
Zoë Gidiere 3f77b4a975 Minor cleanup 2025-06-18 11:37:50 -06:00
Zoë Gidiere 16755fa049 Merge branch 'master' into dev/7.0-2 2025-06-18 11:20:58 -06:00
Zoë Gidiere 68d5b22ca4 bump fabric dep version 2025-06-17 19:08:14 -06:00
Zoë Gidiere 40b8c85c75 Cleanup 2025-06-17 18:50:24 -06:00
Zoë Gidiere 63367e5f03 Final changes 2025-06-17 18:41:09 -06:00
Zoë Gidiere 1d95e7a87d Merge pull request #506 from benwoo1110/feat/multiverse-hook
Implement multiverse generator plugin hook
2025-06-17 16:23:19 -06:00
Zoë Gidiere a25e3cd5a5 Merge branch 'master' into dev/7.0-2 2025-06-17 16:16:41 -06:00
Zoë Gidiere b2e21d8b70 Merge pull request #508 from PolyhedralDev/dev/1.21.6
Dev/1.21.6
2025-06-17 15:34:38 -06:00
Zoë Gidiere 4041239b03 fix build 2025-06-17 15:28:47 -06:00
Zoë Gidiere 280699bbce Update to 1.21.6 and fix a lot of bugs in fabric impl 2025-06-17 15:21:21 -06:00
Zoë Gidiere c4dfdafce8 Merge pull request #507 from everbuild-org/dev/7.0-2
Update Minestom to latest version
2025-06-16 20:02:42 -06:00
Christian Bergschneider 3fe79338db refactor: replace DynamicRegistry.Key with RegistryKey across Minestom components
Updated all references from `DynamicRegistry.Key` to `RegistryKey` to align with the updated Minestom API. Adjusted relevant classes, methods, and object interactions to ensure compatibility and maintain consistency. Updated `Versions.kt` to the latest Minestom version.
2025-06-17 00:10:08 +02:00
Zoë Gidiere 6984dc29d0 Fix fabric 2025-06-14 00:45:32 -06:00
Zoë Gidiere bd253ea5d2 Merge branch 'master' into dev/1.21.6 2025-06-13 22:08:53 -06:00
OakLoaf d743d7d1df Updated fabric to rc1 2025-06-13 22:50:55 +01:00
OakLoaf 238a7954a7 Added paperweight to bukkit platform for runDevBundleServer task 2025-06-13 21:56:54 +01:00
OakLoaf c2319ca4ab Updated to 1.21.6-rc.1 2025-06-13 20:17:56 +01:00
Ben Woo 95172bfa7e Fix checkstyle for catch 2025-06-13 22:33:41 +08:00
Ben Woo 124dbc8836 Improve error checking for multiverse hook 2025-06-13 19:13:57 +08:00
Zoë Gidiere 8706340584 Fix wolves 2025-06-12 16:25:14 -06:00
OakLoaf 9a9f90aa0d Updated fabric platform to 1.21.6 2025-06-10 12:01:17 +01:00
OakLoaf 20a5bfdd0f Updated bukkit platform to 1.21.6 2025-06-10 11:44:10 +01:00
Ben Woo 4fee8cdb24 More example usages by iterating config pack 2025-06-10 12:06:24 +08:00
Ben Woo 70de38ffcb Fix exception variable name 2025-06-10 12:05:59 +08:00
Ben Woo 6722d22f72 Fix onarandombox repo url 2025-06-10 12:05:46 +08:00
Ben Woo c5526c86a2 Implement multiverse plugin hook 2025-06-09 22:58:41 +08:00
Zoë Gidiere 84fa72f96c Catch all runtime errors when loading packs 2025-06-07 22:14:36 -06:00
Zoë Gidiere cc5258ce73 bump version 2025-06-07 21:12:26 -06:00
Christian Bergschneider 7f324bd72b fix: remove unused player configuration phase in biome preload
The loop triggering the player configuration phase was removed as it is unnecessary and unrelated to biome preloading. This streamlines the function and avoids redundant operations during biome initialization.
2025-06-07 16:28:50 +02:00
Zoë Gidiere 748e027282 Merge pull request #505 from HaHaWTH/master
Identify Moonrise worker threads correctly
2025-06-07 07:18:45 +00:00
HaHaWTH bf6612edd0 Identify Moonrise worker threads correctly 2025-06-07 00:17:51 +14:00
410 changed files with 4003 additions and 7595 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
- name: Set up JDK 21
uses: actions/setup-java@v4.7.1
with:
java-version: '21'
java-version: '25'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
Vendored
+149
View File
@@ -0,0 +1,149 @@
pipeline {
agent any
tools {
jdk "Temurin Java 21"
}
triggers {
githubPush()
}
environment {
DISCORD_WEBHOOK_URL = credentials('polydev-discord-webhook-url')
}
stages {
stage('Checkout') {
steps {
scmSkip(deleteBuild: true)
}
}
stage('Setup Gradle') {
steps {
sh 'chmod +x gradlew'
}
}
stage('Build') {
steps {
withGradle {
sh './gradlew build --rerun-tasks -x check'
sh './gradlew javadoc'
}
}
post {
success {
archiveArtifacts artifacts: 'platforms/fabric/build/libs/Terra-fabric*.jar,platforms/bukkit/build/libs/Terra-bukkit*-shaded.jar,platforms/allay/build/libs/Terra-allay*.jar,platforms/minestom/build/libs/Terra-minestom*.jar', fingerprint: true, onlyIfSuccessful: true
javadoc javadocDir: 'common/api/build/docs/javadoc', keepAll: true
}
}
}
stage('Tests') {
steps {
withGradle {
sh './gradlew test --rerun-tasks'
}
}
}
// stage('Deploy to snapshots repositories') {
// when {
// allOf {
// not { buildingTag() }
// not { expression { env.TAG_NAME != null && env.TAG_NAME.matches('v\\d+\\.\\d+\\.\\d+') } }
// }
// }
//
// steps {
// withCredentials([
// string(credentialsId: 'maven-signing-key', variable: 'ORG_GRADLE_PROJECT_signingKey'),
// string(credentialsId: 'maven-signing-key-password', variable: 'ORG_GRADLE_PROJECT_signingPassword'),
// usernamePassword(
// credentialsId: 'solo-studios-maven',
// passwordVariable: 'ORG_GRADLE_PROJECT_SoloStudiosSnapshotsPassword',
// usernameVariable: 'ORG_GRADLE_PROJECT_SoloStudiosSnapshotsUsername'
// )
// ]) {
// withGradle {
// sh './gradlew publishAllPublicationsToSoloStudiosSnapshotsRepository'
// }
// }
// }
// }
stage('Deploy to releases repositories') {
// when {
// allOf {
// buildingTag()
// expression { env.TAG_NAME != null && env.TAG_NAME.matches('v\\d+\\.\\d+\\.\\d+') }
// }
// }
steps {
withCredentials([
string(credentialsId: 'maven-signing-key', variable: 'ORG_GRADLE_PROJECT_signingKey'),
string(credentialsId: 'maven-signing-key-password', variable: 'ORG_GRADLE_PROJECT_signingPassword'),
usernamePassword(
credentialsId: 'solo-studios-maven',
passwordVariable: 'ORG_GRADLE_PROJECT_SoloStudiosReleasesPassword',
usernameVariable: 'ORG_GRADLE_PROJECT_SoloStudiosReleasesUsername'
),
// TODO: does not yet exist (uncomment once added)
// usernamePassword(
// credentialsId: 'sonatype-maven-credentials',
// passwordVariable: 'ORG_GRADLE_PROJECT_SonatypePassword',
// usernameVariable: 'ORG_GRADLE_PROJECT_SonatypeUsername'
// ),
// usernamePassword(
// credentialsId: 'codemc-maven-credentials',
// passwordVariable: 'ORG_GRADLE_PROJECT_CodeMCPassword',
// usernameVariable: 'ORG_GRADLE_PROJECT_CodeMCUsername'
// )
]) {
withGradle {
sh './gradlew publish'
//sh './gradlew publishAllPublicationsToSoloStudiosReleasesRepository'
// sh './gradlew publishAllPublicationsToSonatypeRepository'
// sh './gradlew publishAllPublicationsToCodeMCRepository'
}
}
}
}
}
post {
always {
discoverReferenceBuild()
// junit testResults: '**/build/test-results/*/TEST-*.xml'
recordIssues(
aggregatingResults: true,
enabledForFailure: true,
minimumSeverity: 'ERROR',
sourceCodeEncoding: 'UTF-8',
checksAnnotationScope: 'ALL',
sourceCodeRetention: 'LAST_BUILD',
tools: [java(), javaDoc()]
)
discordSend(
title: env.JOB_NAME + ' ' + env.BUILD_DISPLAY_NAME,
showChangeset: true,
enableArtifactsList: true,
link: env.BUILD_URL,
result: currentBuild.currentResult,
customAvatarUrl: 'https://github.com/PolyhedralDev.png',
customUsername: 'Solo Studios Jenkins',
webhookURL: env.DISCORD_WEBHOOK_URL,
)
cleanWs()
}
}
}
+12 -6
View File
@@ -6,6 +6,12 @@ plugins {
repositories {
mavenCentral()
gradlePluginPortal()
maven("https://maven.solo-studios.ca/releases") {
name = "Solo Studios"
}
maven("https://maven.solo-studios.ca/snapshots") {
name = "Solo Studios"
}
maven("https://repo.codemc.org/repository/maven-public") {
name = "CodeMC"
}
@@ -16,11 +22,11 @@ repositories {
dependencies {
//TODO Allow pulling from Versions.kt
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.6")
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.9")
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "2.0.0-beta.17")
implementation("org.ow2.asm", "asm", "9.8")
implementation("org.ow2.asm", "asm-tree", "9.8")
implementation("com.dfsek.tectonic", "common", "4.2.1")
implementation("org.yaml", "snakeyaml", "2.4")
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "2.0.0-beta.18")
implementation("org.ow2.asm", "asm", "9.9")
implementation("org.ow2.asm", "asm-tree", "9.9")
implementation("com.dfsek.tectonic", "common", "4.3.1")
implementation("org.yaml", "snakeyaml", "2.5")
}
@@ -13,6 +13,7 @@ import org.gradle.kotlin.dsl.getByName
import org.gradle.kotlin.dsl.register
import org.gradle.kotlin.dsl.withType
import org.gradle.language.jvm.tasks.ProcessResources
import org.gradle.plugins.ide.idea.model.IdeaModel
fun Project.configureCompilation() {
apply(plugin = "maven-publish")
@@ -21,6 +22,13 @@ fun Project.configureCompilation() {
apply(plugin = "idea")
apply<TectonicDocPlugin>()
configure<IdeaModel> {
module {
isDownloadJavadoc = true
isDownloadSources = true
}
}
configure<JavaPluginExtension> {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
+8 -14
View File
@@ -30,6 +30,12 @@ fun Project.configureDependencies() {
repositories {
mavenCentral()
gradlePluginPortal()
maven("https://maven.solo-studios.ca/releases") {
name = "Solo Studios"
}
maven("https://maven.solo-studios.ca/snapshots") {
name = "Solo Studios"
}
maven("https://maven.fabricmc.net/") {
name = "FabricMC"
}
@@ -51,20 +57,8 @@ fun Project.configureDependencies() {
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") {
name = "Sonatype Snapshots"
}
maven("https://repo.opencollab.dev/maven-releases/") {
name = "OpenCollab Releases"
}
maven("https://repo.opencollab.dev/maven-snapshots/") {
name = "OpenCollab Snapshots"
}
maven("https://storehouse.okaeri.eu/repository/maven-public/") {
name = "Okaeri"
}
maven("https://maven.solo-studios.ca/releases") {
name = "Solo Studios"
}
maven("https://maven.solo-studios.ca/snapshots") {
name = "Solo Studios"
maven("https://repo.onarandombox.com/multiverse-releases") {
name = "onarandombox"
}
}
+24 -5
View File
@@ -49,10 +49,21 @@ fun Project.configureDistribution() {
doFirst {
try {
file("${buildDir}/resources/main/packs/").deleteRecursively()
file("${buildDir}/resources/main/metapacks/").deleteRecursively()
val overworldPackUrl =
URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/Overworld.zip")
val reimagENDPackUrl =
URL("https://github.com/PolyhedralDev/ReimagEND/releases/download/" + Versions.Terra.reimagENDConfig + "/ReimagEND.zip")
val tartarusPackUrl =
URL("https://github.com/PolyhedralDev/Tartarus/releases/download/" + Versions.Terra.tartarusConfig + "/Tartarus.zip")
val defaultPackUrl =
URL("https://github.com/PolyhedralDev/TerraOverworldConfig/releases/download/" + Versions.Terra.overworldConfig + "/default.zip")
downloadPack(defaultPackUrl, project)
} catch (_:Exception) {}
URL("https://github.com/PolyhedralDev/DefaultMetapack/releases/download/" + Versions.Terra.defaultConfig + "/default.zip")
downloadPack(overworldPackUrl, project)
downloadPack(reimagENDPackUrl, project)
downloadPack(tartarusPackUrl, project)
downloadPack(defaultPackUrl, project, true)
} catch (_: Exception) {
}
}
}
@@ -96,6 +107,13 @@ fun Project.configureDistribution() {
resources.computeIfAbsent("packs") { ArrayList() }.add(it.name)
}
val metaPacksDir = File("${project.buildDir}/resources/main/metapacks/")
metaPacksDir.walkTopDown().forEach {
if (it.isDirectory || !it.name.endsWith(".zip")) return@forEach
resources.computeIfAbsent("metapacks") { ArrayList() }.add(it.name)
}
val langDir = File("${project(":common:implementation").buildDir}/resources/main/lang/")
langDir.walkTopDown().forEach {
@@ -163,9 +181,10 @@ fun Project.configureDistribution() {
}
}
fun downloadPack(packUrl: URL, project: Project) {
fun downloadPack(packUrl: URL, project: Project, metapack: Boolean = false) {
val fileName = packUrl.file.substring(packUrl.file.lastIndexOf("/"))
val file = File("${project.buildDir}/resources/main/packs/${fileName}")
val resourceType = if (metapack) "metapacks" else "packs"
val file = File("${project.buildDir}/resources/main/${resourceType}/${fileName}")
file.parentFile.mkdirs()
file.outputStream().write(packUrl.readBytes())
}
+7 -6
View File
@@ -16,16 +16,17 @@ fun Project.configurePublishing() {
}
repositories {
val mavenUrl = "https://repo.codemc.io/repository/maven-releases/"
val mavenUrl = "https://maven.solo-studios.ca/releases/"
//val mavenSnapshotUrl = "https://repo.codemc.io/repository/maven-snapshots/"
maven(mavenUrl) {
val mavenUsername: String? by project
val mavenPassword: String? by project
if (mavenUsername != null && mavenPassword != null) {
val SoloStudiosReleasesUsername: String? by project
val SoloStudiosReleasesPassword: String? by project
if (SoloStudiosReleasesUsername != null && SoloStudiosReleasesPassword != null) {
credentials {
username = mavenUsername
password = mavenPassword
username = SoloStudiosReleasesUsername
password = SoloStudiosReleasesPassword
}
}
}
+4 -8
View File
@@ -1,25 +1,21 @@
import java.io.ByteArrayOutputStream
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.kotlin.dsl.support.serviceOf
var isPrerelease = false
fun Project.getGitHash(): String {
val stdout = ByteArrayOutputStream()
exec {
return providers.exec {
commandLine = mutableListOf("git", "rev-parse", "--short", "HEAD")
standardOutput = stdout
}
return stdout.toString().trim()
}.standardOutput.asText.get().trim()
}
fun Project.gitClone(name: String) {
val stdout = ByteArrayOutputStream()
exec {
providers.exec {
commandLine = mutableListOf("git", "clone", name)
standardOutput = stdout
}
}
+43 -34
View File
@@ -1,36 +1,39 @@
object Versions {
object Terra {
const val overworldConfig = "v1.5.1"
const val overworldConfig = "latest"
const val reimagENDConfig = "latest"
const val tartarusConfig = "latest"
const val defaultConfig = "latest"
}
object Libraries {
const val tectonic = "4.2.1"
const val paralithic = "1.0.3"
const val tectonic = "4.3.1"
const val paralithic = "2.0.1"
const val strata = "1.3.2"
const val seismic = "0.3.4"
const val seismic = "2.5.7"
const val cloud = "2.0.0"
const val caffeine = "3.2.0"
const val caffeine = "3.2.2"
const val slf4j = "2.0.17"
object Internal {
const val shadow = "8.3.6"
const val apacheText = "1.13.1"
const val apacheIO = "2.19.0"
const val guava = "33.4.8-jre"
const val asm = "9.8"
const val snakeYml = "2.4"
const val jetBrainsAnnotations = "26.0.2"
const val junit = "5.13.0"
const val shadow = "8.3.9"
const val apacheText = "1.14.0"
const val apacheIO = "2.20.0"
const val guava = "33.5.0-jre"
const val asm = "9.9"
const val snakeYml = "2.5"
const val jetBrainsAnnotations = "26.0.2-1"
const val junit = "6.0.0"
const val nbt = "6.1"
}
}
object Fabric {
const val fabricAPI = "0.125.3+${Mod.minecraft}"
const val cloud = "2.0.0-beta.10"
const val fabricAPI = "0.140.0+${Mod.minecraft}"
const val cloud = "2.0.0-beta.13"
}
//
// object Quilt {
@@ -39,14 +42,15 @@ object Versions {
// }
object Mod {
const val mixin = "0.15.5+mixin.0.8.7"
const val mixin = "0.16.5+mixin.0.8.7"
const val mixinExtras = "0.5.0"
const val minecraft = "1.21.5"
const val yarn = "$minecraft+build.1"
const val fabricLoader = "0.16.14"
const val minecraft = "1.21.11"
const val yarn = "$minecraft+build.3"
const val fabricLoader = "0.18.3"
const val architecuryLoom = "1.10.431"
const val architecturyPlugin = "3.4.161"
const val architecturyLoom = "1.13.463"
const val architecturyPlugin = "3.4.162"
}
//
@@ -56,18 +60,20 @@ object Versions {
// }
object Bukkit {
const val minecraft = "1.21.5-R0.1"
const val paperBuild = "$minecraft-20250529.121722-14"
const val minecraft = "1.21.11-rc3"
const val nms = "$minecraft-R0.1"
const val paperBuild = "$nms-20251208.200020-2"
const val paper = paperBuild
const val paperLib = "1.0.8"
const val reflectionRemapper = "0.1.2"
const val paperDevBundle = "$minecraft-20250529.121722-99"
const val reflectionRemapper = "0.1.3"
const val paperDevBundle = paperBuild
const val runPaper = "2.3.1"
const val paperWeight = "2.0.0-beta.17"
const val cloud = "2.0.0-beta.10"
const val paperWeight = "2.0.0-beta.19"
const val cloud = "2.0.0-beta.12"
const val multiverse = "5.3.0"
}
//
//
// object Sponge {
// const val sponge = "9.0.0-SNAPSHOT"
// const val mixin = "0.8.2"
@@ -75,18 +81,21 @@ object Versions {
// }
//
object CLI {
const val logback = "1.5.18"
const val logback = "1.5.19"
const val picocli = "4.7.7"
}
object Allay {
const val api = "0.4.1"
const val gson = "2.13.1"
const val mappings = "3626653"
const val mappingsGenerator = "366618e"
const val api = "0.13.0"
const val gson = "2.13.2"
const val mappings = "15398c1"
const val mappingsGenerator = "8fa6058"
const val mcmeta = "e85a17c"
}
object Minestom {
const val minestom = "1_21_5-4d91778331"
const val minestom = "2025.12.20c-1.21.11"
}
}
@@ -46,6 +46,6 @@ class BaseBiomeColumn implements Column<Biome> {
@Override
public Biome get(int y) {
return biomeProvider.extrude(base, x, y, z, seed);
return biomeProvider.pipeline.extrude(base, x, y, z, seed);
}
}
@@ -6,37 +6,33 @@ import java.util.Set;
import java.util.stream.Collectors;
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
import com.dfsek.terra.addons.biome.extrusion.utils.ExtrusionPipeline;
import com.dfsek.terra.addons.biome.extrusion.utils.ExtrusionPipelineFactory;
import com.dfsek.terra.api.util.Column;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class BiomeExtrusionProvider implements BiomeProvider {
public final ExtrusionPipeline pipeline;
private final BiomeProvider delegate;
private final Set<Biome> biomes;
private final List<Extrusion> extrusions;
private final int resolution;
public BiomeExtrusionProvider(BiomeProvider delegate, List<Extrusion> extrusions, int resolution) {
this.delegate = delegate;
this.biomes = delegate.stream().collect(Collectors.toSet());
extrusions.forEach(e -> biomes.addAll(e.getBiomes()));
this.extrusions = extrusions;
this.pipeline = ExtrusionPipelineFactory.create(extrusions);
this.resolution = resolution;
}
@Override
public Biome getBiome(int x, int y, int z, long seed) {
Biome delegated = delegate.getBiome(x, y, z, seed);
return extrude(delegated, x, y, z, seed);
}
public Biome extrude(Biome original, int x, int y, int z, long seed) {
for(Extrusion extrusion : extrusions) {
original = extrusion.extrude(original, x, y, z, seed);
}
return original;
return pipeline.extrude(delegated, x, y, z, seed);
}
@Override
@@ -64,4 +60,4 @@ public class BiomeExtrusionProvider implements BiomeProvider {
public BiomeProvider getDelegate() {
return delegate;
}
}
}
@@ -1,11 +1,11 @@
package com.dfsek.terra.addons.biome.extrusion.config.extrusions;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.range.Range;
@@ -1,5 +1,7 @@
package com.dfsek.terra.addons.biome.extrusion.extrusions;
import com.dfsek.seismic.type.sampler.Sampler;
import java.util.Collection;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -7,9 +9,9 @@ import java.util.stream.Collectors;
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
import com.dfsek.terra.addons.biome.query.api.BiomeQueries;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.collection.TriStateIntCache;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.world.biome.Biome;
@@ -18,25 +20,41 @@ import com.dfsek.terra.api.world.biome.Biome;
*/
public class ReplaceExtrusion implements Extrusion {
private final Sampler sampler;
private final Range range;
private final ProbabilityCollection<ReplaceableBiome> biomes;
private final Predicate<Biome> hasTag;
private final TriStateIntCache cache;
public ReplaceExtrusion(Sampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes, String tag) {
this.sampler = sampler;
this.range = range;
this.biomes = biomes;
this.hasTag = BiomeQueries.has(tag);
this.cache = new TriStateIntCache(Biome.INT_ID_COUNTER.get());
}
@Override
public Biome extrude(Biome original, int x, int y, int z, long seed) {
if(hasTag.test(original)) {
return range.ifInRange(y, () -> biomes.get(sampler, x, y, z, seed).get(original), original);
int id = original.getIntID();
long state = cache.get(id);
boolean passes;
if(state == TriStateIntCache.STATE_UNSET) {
// Only run the test if unset in cache
passes = hasTag.test(original);
cache.set(id, passes);
} else {
// Read the primitive long directly
passes = (state == TriStateIntCache.STATE_TRUE);
}
if(passes) {
if(range.isInRange(y)) {
return biomes.get(sampler, x, y, z, seed).get(original);
}
}
return original;
}
@@ -1,14 +1,15 @@
package com.dfsek.terra.addons.biome.extrusion.extrusions;
import com.dfsek.seismic.type.sampler.Sampler;
import java.util.Collection;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
import com.dfsek.terra.addons.biome.extrusion.api.ReplaceableBiome;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.world.biome.Biome;
@@ -0,0 +1,8 @@
package com.dfsek.terra.addons.biome.extrusion.utils;
import com.dfsek.terra.api.world.biome.Biome;
public interface ExtrusionPipeline {
Biome extrude(Biome original, int x, int y, int z, long seed);
}
@@ -0,0 +1,158 @@
package com.dfsek.terra.addons.biome.extrusion.utils;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Type;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
import com.dfsek.terra.api.world.biome.Biome;
import static org.objectweb.asm.Opcodes.AALOAD;
import static org.objectweb.asm.Opcodes.ACC_FINAL;
import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
import static org.objectweb.asm.Opcodes.ALOAD;
import static org.objectweb.asm.Opcodes.ARETURN;
import static org.objectweb.asm.Opcodes.GETFIELD;
import static org.objectweb.asm.Opcodes.ILOAD;
import static org.objectweb.asm.Opcodes.INVOKEINTERFACE;
import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
import static org.objectweb.asm.Opcodes.LLOAD;
import static org.objectweb.asm.Opcodes.PUTFIELD;
import static org.objectweb.asm.Opcodes.RETURN;
import static org.objectweb.asm.Opcodes.SIPUSH;
import static org.objectweb.asm.Opcodes.SWAP;
import static org.objectweb.asm.Opcodes.V1_8;
public class ExtrusionPipelineFactory {
private static final AtomicInteger ID_COUNTER = new AtomicInteger(0);
// Type Descriptors
private static final String EXTRUSION_TYPE = Type.getInternalName(Extrusion.class);
private static final String EXTRUSION_DESC = Type.getDescriptor(Extrusion.class);
private static final String BIOME_DESC = Type.getDescriptor(Biome.class);
private static final String PIPELINE_INTERFACE = Type.getInternalName(ExtrusionPipeline.class);
// Method Signature: (Biome, int, int, int, long) -> Biome
private static final String EXTRUDE_SIG = "(" + BIOME_DESC + "IIIJ)" + BIOME_DESC;
public static ExtrusionPipeline create(List<Extrusion> extrusions) {
// Optimization: If empty, return identity
if(extrusions.isEmpty()) {
return (original, x, y, z, seed) -> original;
}
String className = "com/dfsek/terra/addons/biome/extrusion/GeneratedExtrusionPipeline_" + ID_COUNTER.getAndIncrement();
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
// 1. Define Class
cw.visit(V1_8, ACC_PUBLIC | ACC_FINAL, className, null, "java/lang/Object", new String[]{ PIPELINE_INTERFACE });
// 2. Define Fields (e0, e1, e2...)
for(int i = 0; i < extrusions.size(); i++) {
FieldVisitor fv = cw.visitField(ACC_PRIVATE | ACC_FINAL, "e" + i, EXTRUSION_DESC, null, null);
fv.visitEnd();
}
// 3. Generate Constructor(Extrusion[])
generateConstructor(cw, className, extrusions.size());
// 4. Generate extrude() method
generateExtrudeMethod(cw, className, extrusions.size());
cw.visitEnd();
// 5. Load and Instantiate
byte[] bytecode = cw.toByteArray();
try {
Class<?> generatedClass = new PipelineClassLoader(ExtrusionPipelineFactory.class.getClassLoader())
.defineClass(className.replace('/', '.'), bytecode);
return (ExtrusionPipeline) generatedClass.getConstructor(Extrusion[].class)
.newInstance((Object) extrusions.toArray(new Extrusion[0]));
} catch(Exception e) {
throw new RuntimeException("Failed to generate ExtrusionPipeline", e);
}
}
private static void generateConstructor(ClassWriter cw, String className, int count) {
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "([L" + EXTRUSION_TYPE + ";)V", null, null);
mv.visitCode();
// super()
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
// Assign array elements to fields
for(int i = 0; i < count; i++) {
mv.visitVarInsn(ALOAD, 0); // Load this
mv.visitVarInsn(ALOAD, 1); // Load array argument
mv.visitIntInsn(SIPUSH, i); // Load index
mv.visitInsn(AALOAD); // Load array[i]
mv.visitFieldInsn(PUTFIELD, className, "e" + i, EXTRUSION_DESC);
}
mv.visitInsn(RETURN);
mv.visitMaxs(0, 0); // Computed automatically
mv.visitEnd();
}
private static void generateExtrudeMethod(ClassWriter cw, String className, int count) {
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "extrude", EXTRUDE_SIG, null, null);
mv.visitCode();
// Helper var indices:
// 0: this
// 1: Biome original (We will update this or chain it on stack)
// 2: int x
// 3: int y
// 4: int z
// 5: long seed
mv.visitVarInsn(ALOAD, 1); // Load 'original' Biome onto stack initially
for(int i = 0; i < count; i++) {
// Stack contains: [CurrentBiome]
mv.visitVarInsn(ALOAD, 0); // Load 'this'
mv.visitFieldInsn(GETFIELD, className, "e" + i, EXTRUSION_DESC); // Load Extrusion field
// Stack: [CurrentBiome, Extrusion]
// We need: [Extrusion, CurrentBiome, x, y, z, seed]
mv.visitInsn(SWAP); // Swap to get [Extrusion, CurrentBiome]
mv.visitVarInsn(ILOAD, 2); // x
mv.visitVarInsn(ILOAD, 3); // y
mv.visitVarInsn(ILOAD, 4); // z
mv.visitVarInsn(LLOAD, 5); // seed
// Invoke Extrusion.extrude(Biome, x, y, z, seed)
mv.visitMethodInsn(INVOKEINTERFACE, EXTRUSION_TYPE, "extrude", EXTRUDE_SIG, true);
// Stack now contains: [NewBiome]
// Loop continues using this result as input for the next one
}
mv.visitInsn(ARETURN); // Return the final Biome
mv.visitMaxs(0, 0);
mv.visitEnd();
}
// Custom ClassLoader to inject the bytes
private static class PipelineClassLoader extends ClassLoader {
public PipelineClassLoader(ClassLoader parent) {
super(parent);
}
public Class<?> defineClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}
}
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.biome.image;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.function.Supplier;
import com.dfsek.terra.addons.biome.image.config.ImageProviderTemplate;
import com.dfsek.terra.addons.biome.image.config.converter.ClosestBiomeColorConverterTemplate;
import com.dfsek.terra.addons.biome.image.config.converter.ExactBiomeColorConverterTemplate;
@@ -27,8 +29,6 @@ import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.util.function.Supplier;
public class ImageBiomeProviderAddon implements AddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
@@ -7,8 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline;
import com.dfsek.terra.api.util.cache.SeededVector2Key;
import com.dfsek.seismic.type.sampler.Sampler;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
@@ -22,9 +21,9 @@ import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
import com.dfsek.terra.addons.biome.pipeline.api.Pipeline;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.registry.key.StringIdentifiable;
import com.dfsek.terra.api.util.Column;
import com.dfsek.terra.api.util.cache.SeededVector2Key;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
@@ -1,9 +1,9 @@
package com.dfsek.terra.addons.biome.pipeline.api;
import com.dfsek.terra.api.util.cache.SeededVector2Key;
import java.util.List;
import com.dfsek.terra.api.util.cache.SeededVector2Key;
public interface Pipeline {
BiomeChunk generateChunk(SeededVector2Key worldCoordinates);
@@ -7,6 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline.config;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Description;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -19,7 +20,6 @@ import com.dfsek.terra.addons.biome.pipeline.api.Source;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.pipeline.PipelineImpl;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
@@ -7,6 +7,7 @@
package com.dfsek.terra.addons.biome.pipeline.config.source;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.tectonic.api.config.template.annotations.Description;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -14,7 +15,6 @@ import com.dfsek.terra.addons.biome.pipeline.api.Source;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.source.SamplerSource;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@@ -7,13 +7,13 @@
package com.dfsek.terra.addons.biome.pipeline.config.stage;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.tectonic.api.config.template.annotations.Description;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
public abstract class StageTemplate implements ObjectTemplate<Stage> {
@@ -1,9 +1,9 @@
package com.dfsek.terra.addons.biome.pipeline.pipeline;
import java.util.List;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import java.util.List;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk;
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
@@ -73,12 +73,13 @@ public class BiomeChunkImpl implements BiomeChunk {
lookupArray = tempArray;
// Apply stage to working grid
ViewPoint viewPoint = new ViewPoint(this, gridInterval, lookupArray, size);
for(int gridZ = 0; gridZ < gridSize; gridZ = gridZ + 1) {
for(int gridX = 0; gridX < gridSize; gridX = gridX + 1) {
int xIndex = gridOrigin + gridX * gridInterval;
int zIndex = gridOrigin + gridZ * gridInterval;
biomes[(xIndex * size) + zIndex] = stage.apply(
new ViewPoint(this, gridInterval, gridX, gridZ, xIndex, zIndex, lookupArray, size));
viewPoint.set(gridX, gridZ, xIndex, zIndex);
biomes[(xIndex * size) + zIndex] = stage.apply(viewPoint);
}
}
}
@@ -157,25 +158,32 @@ public class BiomeChunkImpl implements BiomeChunk {
*/
public static class ViewPoint {
private final BiomeChunkImpl chunk;
private final PipelineBiome biome;
private PipelineBiome biome;
private final int gridInterval;
private final int gridX;
private final int gridZ;
private final int xIndex;
private final int zIndex;
private int gridX;
private int gridZ;
private int xIndex;
private int zIndex;
private final PipelineBiome[] lookupArray;
private final int size;
private ViewPoint(BiomeChunkImpl chunk, int gridInterval, int gridX, int gridZ, int xIndex, int zIndex,
private ViewPoint(BiomeChunkImpl chunk, int gridInterval,
PipelineBiome[] lookupArray, int size) {
this.chunk = chunk;
this.gridInterval = gridInterval;
this.gridX = 0;
this.gridZ = 0;
this.xIndex = 0;
this.zIndex = 0;
this.lookupArray = lookupArray;
this.size = size;
}
public void set(int gridX, int gridZ, int xIndex, int zIndex) {
this.gridX = gridX;
this.gridZ = gridZ;
this.xIndex = xIndex;
this.zIndex = zIndex;
this.lookupArray = lookupArray;
this.size = size;
this.biome = lookupArray[(this.xIndex * this.size) + this.zIndex];
}
@@ -1,7 +1,5 @@
package com.dfsek.terra.addons.biome.pipeline.pipeline;
import com.dfsek.terra.api.util.cache.SeededVector2Key;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -12,6 +10,7 @@ import com.dfsek.terra.addons.biome.pipeline.api.Expander;
import com.dfsek.terra.addons.biome.pipeline.api.Pipeline;
import com.dfsek.terra.addons.biome.pipeline.api.Source;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.api.util.cache.SeededVector2Key;
public class PipelineImpl implements Pipeline {
@@ -7,9 +7,10 @@
package com.dfsek.terra.addons.biome.pipeline.source;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.addons.biome.pipeline.api.Source;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@@ -1,9 +1,10 @@
package com.dfsek.terra.addons.biome.pipeline.stage.expander;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.addons.biome.pipeline.api.Expander;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
public class FractalExpander implements Expander {
@@ -7,6 +7,9 @@
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.seismic.type.vector.Vector2Int;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -14,12 +17,9 @@ import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import com.dfsek.seismic.type.vector.Vector2Int;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@@ -7,6 +7,9 @@
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.seismic.type.vector.Vector2Int;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -16,9 +19,7 @@ import java.util.function.Predicate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.seismic.type.vector.Vector2Int;
public class BorderStage implements Stage {
@@ -7,6 +7,8 @@
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
import com.dfsek.seismic.type.sampler.Sampler;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -15,7 +17,6 @@ import java.util.stream.Stream;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@@ -7,6 +7,8 @@
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
import com.dfsek.seismic.type.sampler.Sampler;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;
@@ -14,7 +16,6 @@ import java.util.stream.Stream;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@@ -7,12 +7,13 @@
package com.dfsek.terra.addons.biome.pipeline.stage.mutators;
import com.dfsek.seismic.type.sampler.Sampler;
import java.util.Objects;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.biome.pipeline.pipeline.BiomeChunkImpl;
import com.dfsek.seismic.type.sampler.Sampler;
public class SmoothStage implements Stage {
@@ -1,11 +0,0 @@
version = version("0.1.0")
dependencies {
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
api("com.dfsek", "paralithic", Versions.Libraries.paralithic)
}
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
relocate("net.jafama", "com.dfsek.terra.addons.chunkgenerator.lib.jafama")
relocate("com.dfsek.paralithic", "com.dfsek.terra.addons.chunkgenerator.lib.paralithic")
}
@@ -1,177 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.sampler.ElevationLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.function.Supplier;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.DotProductLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.AdjacentPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.SimplePointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CubePointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CuboidPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.SphericalPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.DifferencePointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.ExpressionFilterPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.IntersectionPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.UnionPointSetTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.sampler.BiomeDefinedLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.sampler.DensityLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider;
public class LayeredChunkGeneratorAddon implements AddonInitializer {
private static final Logger logger = LoggerFactory.getLogger( LayeredChunkGeneratorAddon.class);
public static final TypeKey<Supplier<ObjectTemplate<PointSet>>> POINT_SET_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerSampler>>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<InstanceWrapper<LayerSampler>> LAYER_SAMPLER_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerPalette>>> LAYER_PALETTE_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<InstanceWrapper<LayerPalette>> LAYER_PALETTE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerPredicate>>> LAYER_PREDICATE_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<InstanceWrapper<LayerPredicate>> LAYER_PREDICATE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerResolver>>> LAYER_RESOLVER_TYPE_TOKEN = new TypeKey<>() {
};
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override
public void initialize() {
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPreLoadEvent.class)
.priority(1000)
.then(event -> {
event.getPack().applyLoader(RelationalOperator.class,
(type, o, loader, depthTracker) -> RelationalOperator.valueOf((String) o));
CheckedRegistry<Supplier<ObjectTemplate<PointSet>>> pointSetTypeRegistry = event.getPack().getOrCreateRegistry(
POINT_SET_TYPE_TOKEN);
pointSetTypeRegistry.register(addon.key("LIST"), SimplePointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("ADJACENT"), AdjacentPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("SPHERE"), SphericalPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("CUBOID"), CuboidPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("CUBE"), CubePointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("UNION"), UnionPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("INTERSECTION"), IntersectionPointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("DIFFERENCE"), DifferencePointSetTemplate::new);
pointSetTypeRegistry.register(addon.key("EXPRESSION"), ExpressionFilterPointSetTemplate::new);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerSampler>>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN);
CheckedRegistry<InstanceWrapper<LayerSampler>> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN);
samplerTypeRegistry.register(addon.key("DENSITY"), DensityLayerSamplerTemplate::new);
samplerTypeRegistry.register(addon.key("ELEVATION"), ElevationLayerSamplerTemplate::new);
samplerTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerSamplerTemplate::new);
event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> {
samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler));
});
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerPredicate>>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN);
predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new);
predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new);
predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new);
predicateTypeRegistry.register(addon.key("SAMPLER_POINTS"), SamplerListLayerPredicateTemplate::new);
CheckedRegistry<InstanceWrapper<LayerPredicate>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN);
event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> {
predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate));
});
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerPalette>>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN);
paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new);
paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new);
paletteTypeRegistry.register(addon.key("AIR"), () -> new PlatformAirLayerPaletteTemplate(platform));
paletteTypeRegistry.register(addon.key("SURFACE_NORMAL"), DotProductLayerPaletteTemplate::new);
event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack()));
CheckedRegistry<InstanceWrapper<LayerPalette>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN);
event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> {
paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette));
});
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerResolver>>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN);
resolverTypeRegistry.register(addon.key("TEST"), PredicateLayerResolverTemplate::new);
resolverTypeRegistry.register(addon.key("LAYER"), PaletteLayerResolverTemplate::new);
LayerResolver resolver = event.loadTemplate(new LayerResolverPackConfigTemplate()).getResolver();
event.getPack()
.getOrCreateRegistry(ChunkGeneratorProvider.class)
.register(addon.key("LAYERED"),
pack -> new LayeredChunkGenerator(platform, resolver));
})
.failThrough();
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigurationLoadEvent.class)
.priority(1000)
.then(BiomeDefinedLayerPalette.injectLayerPalettes)
.then(BiomeDefinedLayerSampler.injectLayerSamplers);
}
}
@@ -1,72 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.tectonic.api.depth.DepthTracker;
import com.dfsek.tectonic.api.exception.LoadException;
import com.dfsek.tectonic.api.loader.ConfigLoader;
import com.dfsek.tectonic.api.loader.type.TypeLoader;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.AnnotatedType;
import java.util.HashMap;
import java.util.Map;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public abstract class LayerPalette {
private final Group group;
private final boolean resetsGroup;
protected LayerPalette(Group group, boolean resetsGroup) {
this.group = group;
this.resetsGroup = resetsGroup;
}
public abstract Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
public final Group getGroup() {
return group;
}
public final boolean resetsGroup() {
return resetsGroup;
}
public static class Group {
public static Group NO_GROUP = new Group();
private Group() {}
public static Group get(String string, ConfigPack pack) {
if (!pack.getContext().has(Holder.class)) {
pack.getContext().put(new Holder(new HashMap<>()));
}
return pack.getContext().get(Holder.class).groups.computeIfAbsent(string, s -> new Group());
}
private record Holder(Map<String, Group> groups) implements Properties {}
public static class Loader implements TypeLoader<Group> {
private final ConfigPack pack;
public Loader(ConfigPack pack) {
this.pack = pack;
}
@Override
public Group load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader,
DepthTracker depthTracker) throws LoadException {
String groupName = (String) o;
return Group.get(groupName, pack);
}
}
}
}
@@ -1,9 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface LayerPredicate {
boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider);
}
@@ -1,9 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface LayerResolver {
LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
}
@@ -1,12 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface LayerSampler {
double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider);
ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider);
double getBlendWeight();
}
@@ -1,9 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.api.chunk;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface ChunkLayerSampler {
double sample(int fmX, int y, int fmZ);
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerPalettePackConfigTemplate implements ConfigTemplate {
@Value("generation.layers")
private @Meta Map<String, LayerPalette> palettes;
public Map<String, LayerPalette> getPalettes() {
return palettes;
}
}
@@ -1,24 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.LinkedHashMap;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerPredicatePackConfigTemplate implements ConfigTemplate {
@Value("generation.tests")
@Default
private @Meta Map<String, LayerPredicate> predicates = new LinkedHashMap<>();
public Map<String, LayerPredicate> getPredicates() {
return predicates;
}
}
@@ -1,18 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerResolverPackConfigTemplate implements ConfigTemplate {
@Value("generation.resolver")
private @Meta LayerResolver resolver;
public LayerResolver getResolver() {
return resolver;
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerSamplerPackConfigTemplate implements ConfigTemplate {
@Value("generation.samplers")
private @Meta Map<String, LayerSampler> samplers;
public Map<String, LayerSampler> getSamplers() {
return samplers;
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class BiomeDefinedLayerPaletteTemplate extends LayerPaletteTemplate {
@Value("default")
@Default
private Palette defaultPalette = null;
@Override
public LayerPalette get() {
return new BiomeDefinedLayerPalette(group, resetsGroup, defaultPalette);
}
}
@@ -1,44 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.HashMap;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.DotProductLayerPalette;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet;
import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class DotProductLayerPaletteTemplate extends LayerPaletteTemplate {
@Value("normal.approximation-points")
@Default
private PointSet normalApproximationPoints = new AdjacentPointSet();
@Value("normal.direction")
@Default
private Vector3 direction = Vector3.of(0, 1, 0);
@Value("normal.sampler")
private InstanceWrapper<LayerSampler> sampler;
@Value("palettes")
private Map<String, Palette> palettes;
@Override
public LayerPalette get() {
Map<Double, Palette> paletteMap = new HashMap<>();
palettes.forEach((s, p) -> {
paletteMap.put(Double.parseDouble(s), p);
});
return new DotProductLayerPalette(group, resetsGroup, normalApproximationPoints, new DoubleNavigableHolder<>(paletteMap), sampler.get(), direction);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
public abstract class LayerPaletteTemplate implements ObjectTemplate<LayerPalette> {
@Value("group")
@Default
protected LayerPalette.Group group = LayerPalette.Group.NO_GROUP;
@Value("resets-group")
@Default
protected boolean resetsGroup = false;
}
@@ -1,22 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette;
import com.dfsek.terra.addons.chunkgenerator.palette.SingletonPalette;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.block.state.BlockState;
public class PlatformAirLayerPaletteTemplate extends LayerPaletteTemplate {
private BlockState air;
public PlatformAirLayerPaletteTemplate(Platform platform) {
this.air = platform.getWorldHandle().air();
}
@Override
public LayerPalette get() {
return new SimpleLayerPalette(group, resetsGroup, new SingletonPalette(air));
}
}
@@ -1,19 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class SimpleLayerPaletteTemplate extends LayerPaletteTemplate {
@Value("palette")
private Palette palette;
@Override
public LayerPalette get() {
return new SimpleLayerPalette(group, resetsGroup, palette);
}
}
@@ -1,15 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet;
public class AdjacentPointSetTemplate implements ObjectTemplate<PointSet> {
@Override
public PointSet get() {
return new AdjacentPointSet();
}
}
@@ -1,22 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.Set;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.SimplePointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class SimplePointSetTemplate implements ObjectTemplate<PointSet> {
@Value("points")
private Set<Vector3Int> list;
@Override
public PointSet get() {
return new SimplePointSet(list);
}
}
@@ -1,19 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet;
public class CubePointSetTemplate implements ObjectTemplate<PointSet> {
@Value("size")
private int size;
@Override
public PointSet get() {
return new CuboidPointSet(-size, -size, -size, size, size, size);
}
}
@@ -1,25 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet;
public class CuboidPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("size.x")
private int xSize;
@Value("size.y")
private int ySize;
@Value("size.z")
private int zSize;
@Override
public PointSet get() {
return new CuboidPointSet(-xSize, -ySize, -zSize, xSize, ySize, zSize);
}
}
@@ -1,19 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.SphericalPointSet;
public class SphericalPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("radius")
private double radius;
@Override
public PointSet get() {
return new SphericalPointSet(radius);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.List;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.DifferencePointSet;
public class DifferencePointSetTemplate implements ObjectTemplate<PointSet> {
@Value("point-sets")
private List<PointSet> set;
@Override
public PointSet get() {
return new DifferencePointSet(set);
}
}
@@ -1,27 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.ExpressionFilterPointSet;
public class ExpressionFilterPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("point-set")
private PointSet set;
@Value("expression")
private String expression;
@Override
public PointSet get() {
try {
return new ExpressionFilterPointSet(set, expression);
} catch(ParseException e) {
throw new RuntimeException("Failed to parse expression.", e);
}
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.List;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.IntersectionPointSet;
public class IntersectionPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("point-sets")
private List<PointSet> sets;
@Override
public PointSet get() {
return new IntersectionPointSet(sets);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.List;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.UnionPointSet;
public class UnionPointSetTemplate implements ObjectTemplate<PointSet> {
@Value("point-sets")
private List<PointSet> sets;
@Override
public PointSet get() {
return new UnionPointSet(sets);
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.BelowLayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.config.meta.Meta;
public class BelowLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("y")
private @Meta int y;
@Override
public LayerPredicate get() {
return new BelowLayerPredicate(y);
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.RangeLayerPredicate;
import com.dfsek.terra.api.util.range.Range;
public class RangeLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("range")
private Range range;
@Override
public LayerPredicate get() {
return new RangeLayerPredicate(range);
}
}
@@ -1,32 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.api.config.meta.Meta;
public class SamplerLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("sampler")
private @Meta InstanceWrapper<LayerSampler> sampler;
@Value("threshold")
@Default
private double threshold = 0;
@Value("operator")
@Default
private RelationalOperator operator = RelationalOperator.GreaterThan;
@Override
public LayerPredicate get() {
return new SamplerLayerPredicate(sampler.get(), operator, threshold);
}
}
@@ -1,36 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.api.config.meta.Meta;
public class SamplerListLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("sampler")
private @Meta InstanceWrapper<LayerSampler> sampler;
@Value("point-set")
private PointSet points;
@Value("threshold")
@Default
private double defaultThreshold = 0;
@Value("operator")
@Default
private RelationalOperator defaultOperator = RelationalOperator.GreaterThan;
@Override
public LayerPredicate get() {
return new SamplerListLayerPredicate(sampler.get(), defaultThreshold, defaultOperator, points);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PaletteLayerResolver;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
public class PaletteLayerResolverTemplate implements ObjectTemplate<LayerResolver> {
@Value("layer")
private InstanceWrapper<LayerPalette> palette;
@Override
public LayerResolver get() {
return new PaletteLayerResolver(palette.get());
}
}
@@ -1,28 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolver;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.api.config.meta.Meta;
public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResolver> {
@Value("if")
private @Meta InstanceWrapper<LayerPredicate> predicate;
@Value("then")
private @Meta LayerResolver trueResolver;
@Value("else")
private @Meta LayerResolver falseResolver;
@Override
public PredicateLayerResolver get() {
return new PredicateLayerResolver(predicate.get(), trueResolver, falseResolver);
}
}
@@ -1,23 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
public class BiomeDefinedLayerSamplerTemplate extends LayerSamplerTemplate {
@Value("default")
@Default
private @Meta Sampler defaultSampler = null;
@Override
public LayerSampler get() {
return new BiomeDefinedLayerSampler(defaultSampler, blend);
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
public class DensityLayerSamplerTemplate extends LayerSamplerTemplate {
@Value("sampler")
private @Meta Sampler sampler;
@Override
public LayerSampler get() {
return new DensityLayerSampler(sampler, blend);
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
public class ElevationLayerSamplerTemplate extends LayerSamplerTemplate {
@Value("sampler")
private @Meta Sampler sampler;
@Override
public LayerSampler get() {
return new ElevationLayerSampler(sampler, blend);
}
}
@@ -1,15 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.api.config.meta.Meta;
public abstract class LayerSamplerTemplate implements ObjectTemplate<LayerSampler> {
@Value("blend")
protected @Meta BlendProperties blend;
}
@@ -1,33 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler.blend;
import com.dfsek.seismic.type.sampler.DerivativeSampler;
import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.tectonic.api.exception.ValidationException;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.api.config.meta.Meta;
public class BlendPropertiesConfig implements ValidatedConfigTemplate, ObjectTemplate<BlendProperties> {
@Value("density")
@Default
private @Meta int density = 3;
@Value("weight")
@Default
private @Meta double weight = 1;
@Override
public boolean validate() throws ValidationException {
return density > 1 && weight > 1 && density % 18 == 0;
}
@Override
public BlendProperties get() {
return BlendProperties.of(density, weight);
}
}
@@ -1,90 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.generation;
import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.util.Column;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public class LayeredChunkGenerator implements ChunkGenerator {
private final Platform platform;
private final LayerResolver resolver;
public LayeredChunkGenerator(Platform platform, LayerResolver resolver) {
this.platform = platform;
this.resolver = resolver;
}
@Override
public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldProperties world, @NotNull BiomeProvider biomeProvider,
int chunkX, int chunkZ) {
platform.getProfiler().push("chunk_base_layered");
int xOrig = (chunkX << 4);
int zOrig = (chunkZ << 4);
long seed = world.getSeed();
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
int cx = xOrig + x;
int cz = zOrig + z;
int paletteLevel = 0;
LayerPalette previousLayerPalette = null;
Column<Biome> biomeColumn = biomeProvider.getColumn(cx, cz, world);
for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) {
Biome biome = biomeColumn.get(y);
LayerPalette layerPalette = resolver.resolve(cx, y, cz, world, biomeProvider);
if (previousLayerPalette == layerPalette) {
paletteLevel++;
} else if (layerPalette.resetsGroup()) {
paletteLevel = 0;
} else if (previousLayerPalette != null && layerPalette.getGroup() == previousLayerPalette.getGroup()) {
paletteLevel++;
} else {
paletteLevel = 0;
}
previousLayerPalette = layerPalette;
chunk.setBlock(cx, y, cz, layerPalette.get(cx, y, cz, world, biomeProvider)
.get(paletteLevel, cx, y, cz, seed));
}
}
}
platform.getProfiler().pop("chunk_base_layered");
}
@Override
public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider) {
long seed = world.getSeed();
Biome biome = biomeProvider.getBiome(x, y, z, seed);
int layer = 0; // Default to layer 0 for now
return resolver.resolve(x, y, z, world, biomeProvider)
.get(x, y, z, world, biomeProvider)
.get(layer, x, y, z, seed);
}
@Override
public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
long seed = world.getSeed();
Biome biome = biomeProvider.getBiome(x, y, z, seed);
return resolver.resolve(x, y, z, world, biomeProvider)
.get(x, y, z, world, biomeProvider);
}
}
@@ -1,70 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public class BiomeDefinedLayerPalette extends LayerPalette {
private final Palette defaultPalette;
public BiomeDefinedLayerPalette(Group group, boolean resetsGroup, Palette defaultPalette) {
super(group, resetsGroup);
this.defaultPalette = defaultPalette;
}
@Override
public Palette get(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
return biomeProvider.getBiome(x, y, z, worldProperties.getSeed()).getContext().get(BiomeLayerPalettes.class).palettes().get(this);
}
public Optional<Palette> getDefaultPalette() {
return Optional.ofNullable(defaultPalette);
}
public static Consumer<ConfigurationLoadEvent> injectLayerPalettes = event -> {
if(event.is(Biome.class)) {
Map<BiomeDefinedLayerPalette, String> paletteFields = new HashMap<>();
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_PALETTE_TOKEN).forEach((registryKey, registryEntry) -> {
LayerPalette layerPalette = registryEntry.get();
// Add template value for each BiomeDefinedLayerPalette
if (layerPalette instanceof BiomeDefinedLayerPalette biomeLayerPalette) {
String id = registryKey.getID();
String fieldName = id + "LayerPalette";
paletteFields.put(biomeLayerPalette, fieldName);
DynamicValue.Builder<Palette> value = DynamicValue.builder("generation.layers." + id, Palette.class);
biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault);
templateBuilder.value(fieldName, value.build());
}
});
DynamicTemplate layerPaletteBiomeTemplate = event.load(templateBuilder.build());
Map<BiomeDefinedLayerPalette, Palette> paletteMap = paletteFields.entrySet().stream().collect(
Collectors.toMap(Entry::getKey, entry -> layerPaletteBiomeTemplate.get(entry.getValue(), Palette.class)));
event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerPalettes(paletteMap));
}
};
public record BiomeLayerPalettes(Map<BiomeDefinedLayerPalette, Palette> palettes) implements Properties {
}
}
@@ -1,43 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder;
import com.dfsek.seismic.type.vector.Vector3;
import com.dfsek.seismic.type.vector.Vector3Int;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public class DotProductLayerPalette extends LayerPalette {
private static final Logger logger = LoggerFactory.getLogger(DotProductLayerPalette.class);
private final DoubleNavigableHolder<Palette> palettes;
private final Vector3Int[] samplePoints;
private final LayerSampler sampler;
private final Vector3 direction;
public DotProductLayerPalette(Group group, boolean resetsGroup,
PointSet points, DoubleNavigableHolder<Palette> palettes, LayerSampler sampler, Vector3 direction) {
super(group, resetsGroup);
this.palettes = palettes;
this.sampler = sampler;
this.direction = direction;
this.samplePoints = points.toArray();
}
@Override
public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
Vector3.Mutable surfaceNormalApproximation = Vector3.Mutable.of(0, 0, 0);
for(Vector3Int point : samplePoints) {
double scalar = -sampler.sample(x+point.getX(), y+point.getY(), z+point.getZ(), world, biomeProvider);
surfaceNormalApproximation.add(point.toFloat().mutable().mulScalar(scalar));
}
return palettes.get(direction.dot(surfaceNormalApproximation.normalize()));
}
}
@@ -1,22 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.palette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public class SimpleLayerPalette extends LayerPalette {
private final Palette palette;
public SimpleLayerPalette(Group group, boolean resetsGroup, Palette palette) {
super(group, resetsGroup);
this.palette = palette;
}
@Override
public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return palette;
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class BelowLayerPredicate implements LayerPredicate {
private final int y;
public BelowLayerPredicate(int y) {
this.y = y;
}
@Override
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
return y < this.y;
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.util.range.Range;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class RangeLayerPredicate implements LayerPredicate {
private final Range range;
public RangeLayerPredicate(Range range) {
this.range = range;
}
@Override
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
return range.isInRange(y);
}
}
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class SamplerLayerPredicate implements LayerPredicate {
private final LayerSampler sampler;
private final double threshold;
private final RelationalOperator operator;
public SamplerLayerPredicate(LayerSampler sampler, RelationalOperator operator, double threshold) {
this.sampler = sampler;
this.operator = operator;
this.threshold = threshold;
}
@Override
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
return operator.test(sampler.sample(x, y, z, worldProperties, biomeProvider), threshold);
}
}
@@ -1,33 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class SamplerListLayerPredicate implements LayerPredicate {
private final Vector3Int[] points;
private final RelationalOperator operator;
private final LayerSampler sampler;
private final double threshold;
public SamplerListLayerPredicate(LayerSampler sampler, double threshold, RelationalOperator operator, PointSet points) {
this.sampler = sampler;
this.threshold = threshold;
this.operator = operator;
this.points = points.toArray();
}
@Override
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
for (Vector3Int point : points) {
if (operator.test(sampler.sample(x + point.getX(), y + point.getY(), z + point.getZ(), worldProperties, biomeProvider), threshold)) return true;
}
return false;
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.resolve;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class PaletteLayerResolver implements LayerResolver {
private final LayerPalette palette;
public PaletteLayerResolver(LayerPalette palette) {
this.palette = palette;
}
@Override
public LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return palette;
}
}
@@ -1,28 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.resolve;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class PredicateLayerResolver implements LayerResolver {
private final LayerPredicate predicate;
private final LayerResolver trueResolver;
private final LayerResolver falseResolver;
public PredicateLayerResolver(LayerPredicate predicate, LayerResolver trueResolver, LayerResolver falseResolver) {
this.predicate = predicate;
this.trueResolver = trueResolver;
this.falseResolver = falseResolver;
}
@Override
public LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return predicate.test(x, y, z, world, biomeProvider) ? trueResolver.resolve(x, y, z, world, biomeProvider) : falseResolver.resolve(x, y, z, world, biomeProvider);
}
}
@@ -1,90 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class BiomeDefinedLayerSampler implements LayerSampler {
private final Sampler defaultSampler;
private final BlendProperties blendProperties;
public BiomeDefinedLayerSampler(@Nullable Sampler defaultSampler, BlendProperties blendProperties) {
this.defaultSampler = defaultSampler;
this.blendProperties = blendProperties;
}
@Override
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return biomeProvider.getBiome(x, y, z, world.getSeed())
.getContext()
.get(BiomeLayerSamplers.class)
.samplers()
.get(this)
.getSample(world.getSeed(), x, y, z);
}
@Override
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
return null;
}
@Override
public double getBlendWeight() {
return blendProperties.weight();
}
private Optional<Sampler> getDefaultSampler() {
return Optional.ofNullable(defaultSampler);
}
public static Consumer<ConfigurationLoadEvent> injectLayerSamplers = event -> {
if(event.is(Biome.class)) {
Map<BiomeDefinedLayerSampler, String> samplerFields = new HashMap<>();
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_SAMPLER_TOKEN).forEach((registryKey, registryEntry) -> {
LayerSampler layerSampler = registryEntry.get();
if (layerSampler instanceof BiomeDefinedLayerSampler biomeLayerSampler) {
String id = registryKey.getID();
String fieldName = id + "LayerSampler";
samplerFields.put(biomeLayerSampler, fieldName);
DynamicValue.Builder<Sampler> value = DynamicValue.builder("generation.samplers." + id, Sampler.class);
biomeLayerSampler.getDefaultSampler().ifPresent(value::setDefault);
templateBuilder.value(fieldName, value.build());
}
});
DynamicTemplate layerSamplerBiomeTemplate = event.load(templateBuilder.build());
Map<BiomeDefinedLayerSampler, Sampler> samplerMap = samplerFields.entrySet().stream().collect(
Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), Sampler.class)));
event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerSamplers(samplerMap));
}
};
public record BiomeLayerSamplers(Map<BiomeDefinedLayerSampler, Sampler> samplers) implements Properties {
}
}
@@ -1,41 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.DensityChunkLayerSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class DensityLayerSampler implements LayerSampler {
private final Sampler sampler;
private final BlendProperties blendProperties;
public DensityLayerSampler(Sampler sampler, BlendProperties blendProperties) {
this.sampler = sampler;
this.blendProperties = blendProperties;
}
@Override
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
//TODO if needed make this match chunk impl
return sampler.getSample(world.getSeed(), x, y, z);
}
@Override
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
return new DensityChunkLayerSampler(chunkX, chunkZ, world, biomeProvider, this, blendProperties);
}
@Override
public double getBlendWeight() {
return blendProperties.weight();
}
}
@@ -1,39 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.DensityChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.ElevationChunkLayerSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class ElevationLayerSampler implements LayerSampler {
private final Sampler sampler;
private final BlendProperties blendProperties;
public ElevationLayerSampler(Sampler sampler, BlendProperties blendProperties) {
this.sampler = sampler;
this.blendProperties = blendProperties;
}
@Override
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
//TODO if needed make this match chunk impl
return sampler.getSample(world.getSeed(), x, z);
}
@Override
public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) {
return new ElevationChunkLayerSampler(chunkX, chunkZ, world, biomeProvider, this, blendProperties);
}
@Override
public double getBlendWeight() {
return blendProperties.weight();
}
}
@@ -1,7 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend;
public record BlendProperties(int density, double weight, int extent) {
public static BlendProperties of(int density, double weight) {
return new BlendProperties(density, weight, Math.max((18 / density) + 1, 1));
}
}
@@ -1,100 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class DensityChunkLayerSampler implements ChunkLayerSampler {
double[] samples;
private final int blendExtent;
private final int min;
private final int blendExtentYExtent;
private final int blendExtentMinus2;
private final int blendYExtendMinus2;
private final int blendDensity;
public DensityChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider, DensityLayerSampler layerSampler, BlendProperties blendProperties) {
this.min = world.getMinHeight() - 1;
int worldMax = world.getMaxHeight() + 1;
blendDensity = blendProperties.density();
int blendYRange = worldMax - min + 1;
int max;
int blendYExtend;
if (blendYRange % blendDensity == 0) {
blendYExtend = blendYRange / blendDensity;
max = worldMax;
} else {
blendYExtend = (blendYRange / blendDensity) + 1;
max = worldMax + 1;
}
blendExtent = blendProperties.extent();
blendExtentYExtent = blendYExtend * blendExtent;
blendExtentMinus2 = blendExtent - 2;
blendYExtendMinus2 = blendYExtend - 2;
samples = new double[blendExtentYExtent * blendExtent];
int xOrigin = (chunkX << 4) - 1;
int zOrigin = (chunkZ << 4) - 1;
for (int x = 0; x < 18; x += blendDensity) {
for (int z = 0; z < 18; z += blendDensity) {
int cx = xOrigin + x;
int cz = zOrigin + z;
for (int y = this.min; y <= max; y++) {
int yi = y - this.min;
int index = x * blendExtentYExtent + yi * blendExtent + z;
samples[index] = layerSampler.sample(cx, y, cz, world, biomeProvider);
}
}
}
}
private double getSample(int x, int y, int z) {
int index = x * blendExtentYExtent + y * blendExtent + z;
return samples[index];
}
@Override
public double sample(int fmX, int y, int fmZ) {
double gx = (double)(fmX + 1) / blendDensity;
double gz = (double)(fmZ + 1) / blendDensity;
double gy = (double)(y - min) / blendDensity;
int x0 = Math.max(0, Math.min(blendExtentMinus2, FloatingPointFunctions.floor(gx)));
int z0 = Math.max(0, Math.min(blendExtentMinus2, FloatingPointFunctions.floor(gz)));
int y0 = Math.max(0, Math.min(blendYExtendMinus2, FloatingPointFunctions.floor(gy)));
int x1 = x0 + 1;
int z1 = z0 + 1;
int y1 = y0 + 1;
double tx = gx - x0;
double tz = gz - z0;
double ty = gy - y0;
// Fetch 8 corners
double c000 = getSample(x0, y0, z0);
double c100 = getSample(x1, y0, z0);
double c010 = getSample(x0, y1, z0);
double c110 = getSample(x1, y1, z0);
double c001 = getSample(x0, y0, z1);
double c101 = getSample(x1, y0, z1);
double c011 = getSample(x0, y1, z1);
double c111 = getSample(x1, y1, z1);
return InterpolationFunctions.triLerp(c000, c100, c010, c110, c001, c101, c011, c111, tx, ty, tz);
}
}
@@ -1,37 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class ElevationChunkLayerSampler implements ChunkLayerSampler {
double[] samples;
public ElevationChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider, ElevationLayerSampler layerSampler,
BlendProperties blendProperties) {
//I see no reason to implement sparse blending here, elevation is inexpensive. If that changes, it can be easily implemented here.
samples = new double[16 * 16];
int xOrigin = chunkX << 4;
int zOrigin = chunkZ << 4;
for (int x = 0; x < 16; x++) {
for (int z = 0; z < 16; z++) {
int cx = xOrigin + x;
int cz = zOrigin + z;
int index = x * 16 + z;
samples[index] = layerSampler.sample(cx, 0, cz, world, biomeProvider);
}
}
}
@Override
public double sample(int fmX, int y, int fmZ) {
int index = fmX * 16 + fmZ;
return samples[index];
}
}
@@ -1,45 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math;
import com.dfsek.terra.addons.chunkgenerator.util.DoubleBiPredicate;
public enum RelationalOperator implements DoubleBiPredicate {
GreaterThan {
@Override
public boolean test(double a, double b) {
return a > b;
}
},
GreaterThanOrEqual {
@Override
public boolean test(double a, double b) {
return a >= b;
}
},
LessThan {
@Override
public boolean test(double a, double b) {
return a < b;
}
},
LessThanOrEqual {
@Override
public boolean test(double a, double b) {
return a <= b;
}
},
Equals {
@Override
public boolean test(double a, double b) {
return a == b;
}
},
NotEquals {
@Override
public boolean test(double a, double b) {
return a != b;
}
};
public abstract boolean test(double a, double b);
}
@@ -1,14 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset;
import java.util.function.Supplier;
import java.util.stream.Stream;
import com.dfsek.seismic.type.vector.Vector3Int;
public interface PointSet extends Supplier<Stream<Vector3Int>> {
default Vector3Int[] toArray() {
return this.get().distinct().toArray(Vector3Int[]::new);
}
}
@@ -1,20 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class AdjacentPointSet implements PointSet {
@Override
public Stream<Vector3Int> get() {
return Stream.of(
Vector3Int.of(0, 0, -1),
Vector3Int.of(0, 0, 1),
Vector3Int.of(0, -1, 0),
Vector3Int.of(0, 1, 0),
Vector3Int.of(-1, 0, 0),
Vector3Int.of(1, 0, 0)
);
}
}
@@ -1,22 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative;
import java.util.Set;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class SimplePointSet implements PointSet {
private final Stream<Vector3Int> points;
public SimplePointSet(Set<Vector3Int> points) {
this.points = points.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,31 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class CuboidPointSet implements PointSet {
private final Stream<Vector3Int> points;
public CuboidPointSet(int x1, int y1, int z1, int x2, int y2, int z2) {
Set<Vector3Int> points = new HashSet<>();
for (int x = x1; x <= x2; x = x + 1) {
for (int y = y1; y <= y2; y = y + 1) {
for (int z = z1; z <= z2; z = z + 1) {
points.add(Vector3Int.of(x, y, z));
}
}
}
this.points = points.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,36 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.seismic.type.DistanceFunction;
public class SphericalPointSet implements PointSet {
private final Stream<Vector3Int> points;
public SphericalPointSet(double radius) {
Stream.Builder<Vector3Int> streamBuilder = Stream.builder();
int roundedRadius = FloatingPointFunctions.ceil(radius);
for(int x = -roundedRadius; x <= roundedRadius; x++) {
for(int y = -roundedRadius; y <= roundedRadius; y++) {
for(int z = -roundedRadius; z <= roundedRadius; z++) {
Vector3Int pos = Vector3Int.of(x, y, z);
double length = pos.toFloat().length(DistanceFunction.Euclidean);
if (length == 0) continue;
if (length > radius) continue;
streamBuilder.add(pos);
}
}
}
this.points = streamBuilder.build();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
import com.google.common.collect.Sets;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class DifferencePointSet implements PointSet {
private final Stream<Vector3Int> points;
public DifferencePointSet(List<PointSet> sets) {
points = sets.stream()
.map(PointSet::get)
.map(s -> s.collect(Collectors.toSet()))
.reduce(Sets::difference).orElse(Collections.emptySet())
.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,32 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
import com.dfsek.paralithic.Expression;
import com.dfsek.paralithic.eval.parser.Parser;
import com.dfsek.paralithic.eval.parser.Scope;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class ExpressionFilterPointSet implements PointSet {
private final Stream<Vector3Int> points;
public ExpressionFilterPointSet(PointSet set, String eq) throws ParseException {
Parser parser = new Parser();
Scope scope = new Scope();
scope.addInvocationVariable("x");
scope.addInvocationVariable("y");
scope.addInvocationVariable("z");
Expression expression = parser.parse(eq, scope);
this.points = set.get().filter(v -> expression.evaluate(v.getX(), v.getY(), v.getZ()) == 1);
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
import com.google.common.collect.Sets;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class IntersectionPointSet implements PointSet {
private final Stream<Vector3Int> points;
public IntersectionPointSet(List<PointSet> sets) {
points = sets.stream()
.map(PointSet::get)
.map(s -> s.collect(Collectors.toSet()))
.reduce(Sets::intersection).orElse(Collections.emptySet())
.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
import com.google.common.collect.Sets;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
import com.dfsek.seismic.type.vector.Vector3Int;
public class UnionPointSet implements PointSet {
private final Stream<Vector3Int> points;
public UnionPointSet(List<PointSet> sets) {
points = sets.stream()
.map(PointSet::get)
.map(s -> s.collect(Collectors.toSet()))
.reduce(Sets::union).orElse(Collections.emptySet())
.stream();
}
@Override
public Stream<Vector3Int> get() {
return points;
}
}
@@ -1,34 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.palette;
import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;
public class DoubleNavigableHolder<T> {
private final NavigableMap<Double, T> map;
public DoubleNavigableHolder(Map<Double, T> inputMap) {
NavigableMap<Double, T> map = new TreeMap<>(inputMap);
map.put(Double.MAX_VALUE, map.lastEntry().getValue());
this.map = map;
}
public T get(double threshold) {
return map.ceilingEntry(threshold).getValue();
}
enum Method {
CEILING,
FLOOR,
CLOSEST
}
public class Single extends DoubleNavigableHolder<T> {
public Single(Map<Double, T> inputMap) {
super(inputMap);
}
}
}
@@ -1,18 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.palette;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class SingletonPalette implements Palette {
private final BlockState blockState;
public SingletonPalette(BlockState blockState) {
this.blockState = blockState;
}
@Override
public BlockState get(int layer, double x, double y, double z, long seed) {
return blockState;
}
}
@@ -1,6 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.util;
@FunctionalInterface
public interface DoubleBiPredicate {
boolean test(double a, double b);
}
@@ -1,12 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.util;
import java.util.function.Supplier;
public record InstanceWrapper<T>(T instance) implements Supplier<T> {
@Override
public T get() {
return instance;
}
}
@@ -1,11 +1,11 @@
package com.dfsek.terra.addons.chunkgenerator.config.noise;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.seismic.type.sampler.Sampler;
public class BiomeNoiseConfigTemplate implements ObjectTemplate<BiomeNoiseProperties> {
@@ -1,6 +1,7 @@
package com.dfsek.terra.addons.chunkgenerator.config.noise;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.api.properties.Properties;
@@ -1,8 +1,9 @@
package com.dfsek.terra.addons.chunkgenerator.generation.math;
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
import com.dfsek.seismic.type.vector.Vector3;
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
public enum SlantCalculationMethod {
DotProduct {

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