Compare commits

..

301 Commits

Author SHA1 Message Date
dfsek e6300df185 implement a bunch of function utils 2026-01-03 15:53:13 -07:00
dfsek 65eb66c3ca add curry and uncurry functions 2026-01-03 04:13:21 -07:00
dfsek aa3fe18339 rename palette-block-shortcut to shortcut-block-palette 2026-01-02 22:26:33 -07:00
dfsek 6a6a3928cd rename structure-block-shortcut to shortcut-block-structure 2026-01-02 22:25:23 -07:00
dfsek ac1258d233 rename library-image to api-image 2026-01-02 22:24:42 -07:00
dfsek b6d42fdcc1 rename biome-query-api to api-biome-query 2026-01-02 22:22:14 -07:00
dfsek a9251fa228 rename api-addon-loader addon-loader-api 2026-01-02 22:20:44 -07:00
dfsek 38a1571941 fix RegistryTest 2026-01-02 22:19:05 -07:00
dfsek b9af66848a rename manifest-addon-loader to addon-loader-manifest 2026-01-02 22:15:14 -07:00
dfsek e9d30b8794 rename Lazy to Memo 2026-01-02 21:13:24 -07:00
dfsek 53dafa4a2c rename IntToBooleanFunction to IntPredicate 2026-01-02 20:04:26 -07:00
dfsek df46c617f2 move Construct to FunctionUtils 2026-01-02 20:04:00 -07:00
dfsek e706ef89fc implement faster map on Lazy 2026-01-02 17:23:03 -07:00
dfsek a66c2a0749 Implement Monad Lazy 2026-01-02 17:12:30 -07:00
dfsek a5fe4d7928 Add annotations 2026-01-02 17:12:20 -07:00
dfsek 966bcab370 add more linkedlist methods 2026-01-02 03:04:19 -07:00
dfsek eae5a60cf9 remove useless methods from Pair 2026-01-01 22:31:44 -07:00
dfsek 9357b18964 refactor some static methods to generic versions in BiFunctor 2026-01-01 22:30:10 -07:00
dfsek 86bb4d5a1a implement Bifunctor Pair 2026-01-01 20:15:05 -07:00
dfsek 47bdd66fe7 Make Pair a record 2026-01-01 20:10:15 -07:00
dfsek eb6b3704d0 add linkedlist 2026-01-01 20:09:06 -07:00
dfsek 8eb5a70d4d fallback to base loader if shortcut doesnt exist 2025-12-30 12:01:40 -07:00
dfsek 5dc9f419ac only apply shortcut if loaded config is a string 2025-12-30 11:58:48 -07:00
dfsek 2215ea8336 tinker with cloud 2025-12-30 01:43:13 -07:00
dfsek 998b6478f3 add more api helpers 2025-12-30 01:27:41 -07:00
dfsek efa4bf5bb4 Generify shortcut configs to work on any type 2025-12-30 00:23:44 -07:00
dfsek 2ad05cbbb6 back ShortcutHolder with generic TypeLoader 2025-12-29 23:21:31 -07:00
dfsek 1bbedf51b5 fix refactor in mixin 2025-12-29 22:48:10 -07:00
dfsek bdcd93f164 refactor some stuff to use new errors 2025-12-29 22:47:59 -07:00
dfsek c4a366112e refactor createBlockState to use new error API 2025-12-29 22:33:07 -07:00
dfsek cb08401536 start working on error handling stuff 2025-12-29 22:18:44 -07:00
dfsek 9a16336f53 convert a bunch of stuff to new APIs 2025-12-29 21:11:11 -07:00
dfsek 16705057e0 update most things to use new maybe and either 2025-12-29 18:59:57 -07:00
dfsek d52cd0d7cf finish maybe 2025-12-29 18:23:42 -07:00
dfsek 7d3382e623 more either stuff 2025-12-29 18:18:14 -07:00
dfsek 87e437f889 finish either 2025-12-29 18:06:16 -07:00
dfsek 292be6bcec add bifunctor 2025-12-29 17:08:40 -07:00
dfsek f03f39f1d7 implement Monad (Maybe a) 2025-12-29 17:05:18 -07:00
dfsek 8bfff6b010 redo maybe 2025-12-29 16:58:37 -07:00
dfsek e5d30183ef fix functional utils 2025-12-29 16:57:29 -07:00
dfsek 3777fda641 Add 2-argument higher-order type and move kinds to their own package
I don't think that we will have higher-order types with more than 2 parameters, so I only made K and K2
2025-12-29 16:07:36 -07:00
dfsek f684c60039 experimenting with kinds and higher order types, not done yet 2025-12-29 16:02:18 -07:00
dfsek ef088dd3f7 add basic functional types again 2025-12-28 23:59:46 -07:00
dfsek 4f672dfb7b make either not bad 2025-12-28 22:27:08 -07:00
dfsek b851b2f881 start addon impl 2025-12-28 22:03:03 -07:00
dfsek 9c64353111 rename MaterialSetLoader 2025-12-28 20:54:16 -07:00
dfsek c537605880 rename MaterialSet 2025-12-28 20:53:51 -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
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
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
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 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 78707468c5 Merge branch 'master' into dev/7.0-2 2025-07-10 19:44:30 -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 3ad0ef8501 Update Seismic + paralihtic 2025-07-09 14:06:01 -06: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 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 a25e3cd5a5 Merge branch 'master' into dev/7.0-2 2025-06-17 16:16:41 -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
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 4eace9e7fb Merge remote-tracking branch 'origin/master' into dev/7.0-2 2025-06-05 21:03:58 -06:00
Zoë Gidiere 39ae1fdf93 Merge branch 'master' into dev/7.0-2 2025-06-05 17:51:01 -06:00
Zoë Gidiere e9d1add6af Merge branch 'master' into dev/7.0-2 2025-06-05 17:21:00 -06:00
Christian Bergschneider 94d135c66c Refactor MinestomBiomeLoader to use DynamicRegistry directly
Simplified biome loading by removing dependency on MinecraftServer and using DynamicRegistry.Key directly. This improves code maintainability and aligns with updated API usage.
2025-06-05 17:04:37 -06:00
Zoë Gidiere 1881051191 Merge pull request #504 from everbuild-org/dev/7.0-2
Apply biomes to minestom instances
2025-06-05 08:16:00 +00:00
Christian Bergschneider 28132e0f13 resolve merge conflicts 2025-06-05 10:08:58 +02:00
Christian Bergschneider 1ef34469cb Merge remote-tracking branch 'ckyuri/dev/7.0-2' into dev/7.0-2 2025-06-05 10:03:50 +02:00
kyuri e79ea4ab82 Minestom Latest - Update (#499)
* Bukkit Build Fix

* remove comments

* remove papermc repo from gradle settings

* add back gradle shasum

* fix formatting, update gradle hash

* Minestom Updated to latest version as of now 4/12/2025

Updated method names to new documentation and changed minestom versioning.

- Paper Build version was changed as I had issues building at all with the snapshot version. So it was changed to a generic version but everything still builds fine.

* Bug Fix - Entity Type was parsing a value that was incorrect and causing issues to load the world.

EntityType.fromId(Integer.parseInt(id));
to
delegate = EntityType.fromKey(id);

* Reverted changes to comply with build version requirements and avoiding pulling functionality out of a common existing function

---------

Co-authored-by: Peter Pan <peter@never.lan>
Co-authored-by: Zoë Gidiere <duplexsys@protonmail.com>
2025-06-04 23:38:42 -06:00
Zoë Gidiere 4450a56ef0 Merge branch 'dev/7.0-2' into dev/7.0-2 2025-06-05 05:38:32 +00:00
Christian Bergschneider a061660e46 chore: Update Minestom version to 1_21_5-4d91778331
This commit updates the Minestom dependency to the latest tagged version. Ensures compatibility with new features and fixes in the updated Minestom release.
2025-06-04 21:52:46 +02:00
Christian Bergschneider abdff16a0a Merge remote-tracking branch 'origin/dev/7.0-2' into dev/7.0-2
# Conflicts:
#	buildSrc/src/main/kotlin/Versions.kt
2025-06-04 21:43:33 +02:00
Christian Bergschneider c08e973e3e feat: provide default MinestomBlockEntity implementation
Introduce the `MinestomBlockEntity` class to represent block entities and hook into the block system. Update `DefaultBlockEntityFactory` to create `MinestomBlockEntity` instances and adjust `TerraMinestomWorldBuilder` initialization for factory injection. These changes improve extensibility and block entity management.
2025-06-04 21:34:04 +02:00
Christian Bergschneider b12fe77f32 feat: add fine-grained biome control to Minestom world builder
Introduced a `doFineGrainedBiomes` flag to allow fine-grained biome control per chunk. This helps mitigate client disconnection issues caused by a Minestom biome encoding bug, with a plan to deprecate once the bug is resolved. Adjusted relevant classes and the example implementation to support this feature.
2025-06-04 21:25:35 +02:00
Zoë Gidiere 28d93d158e fix up 2025-06-03 22:52:26 -06:00
Zoë Gidiere 118dc32d64 Merge branch 'master' into dev/7.0-2 2025-06-03 22:38:32 -06:00
Christian Bergschneider d9a4d64b17 Merge remote-tracking branch 'origin/dev/7.0-2' into dev/7.0-2 2025-06-04 00:05:56 +02:00
Christian Bergschneider 56a1feb708 refactor: move biomes to use user-defined naming conventions.
Replaced "Custom" with "UserDefined" in biome classes, factories, and references for consistency and clarity. Updated relevant imports, method signatures, and internal logic to align with the new terminology. This change improves readability and better represents the purpose of these biome-related components.
2025-06-04 00:05:15 +02:00
Christian Bergschneider 858adfe866 feat: initial custom biome implementation 2025-06-03 22:41:31 +02:00
Zoë Gidiere bdd80d7832 Merge branch 'dev/seismic' into dev/7.0-2 2025-06-03 04:37:11 -06:00
Zoë Gidiere adfdb8d63c update versions 2025-06-03 04:37:03 -06:00
Zoë Gidiere ef10081bcd Merge branch 'dev/7.0-2' into dev/seismic 2025-06-02 17:34:30 -06:00
Zoë Gidiere dc8492a6cb Merge remote-tracking branch 'origin/dev/6.6.2' into dev/7.0-2 2025-06-02 17:34:18 -06:00
Christian Bergschneider 5e1c9d8ebe fix: generation stages not being able to reference eachother 2025-06-02 00:34:48 +02:00
Christian Bergschneider 5dff25670c refactor: minestom chunk storage to improve memory efficiency
Replaced 3D array with a 1D array for chunk block storage and adjusted related logic to use calculated indices. Updated block type comparison to use state IDs instead of block IDs for consistency and correctness.
2025-05-30 09:13:04 +02:00
Christian Bergschneider 089b25dea4 feat: update Minestom version and replace deprecated ItemComponent API
Updated the Minestom library to version 1_21_5-69b9a5d844 and migrated from the deprecated `ItemComponent` API to `DataComponents`. This ensures compatibility with the latest changes and improves maintainability.
2025-05-27 23:25:34 +02:00
Christian Bergschneider 1dd59c378e refactor(minestom): replace static singleton access to platform with dependency injection for better modularity
Renamed `MinestomPlatform` to `TerraMinestomPlatform` and updated `TerraMinestomWorldBuilder` to utilize the platform instance directly. Simplified world builder initialization and improved code clarity.
2025-05-27 22:58:16 +02:00
Christian Bergschneider d97fb4ff7b chore: update paper version 2025-05-27 22:50:03 +02:00
ckyuri 761a014ea5 Reverted changes to comply with build version requirements and avoiding pulling functionality out of a common existing function 2025-04-16 15:54:20 +01:00
ckyuri 9749eecd87 Merge remote-tracking branch 'origin/dev/7.0-2' into dev/7.0-2 2025-04-12 14:11:07 +01:00
ckyuri 32cc4976c8 Bug Fix - Entity Type was parsing a value that was incorrect and causing issues to load the world.
EntityType.fromId(Integer.parseInt(id));
to
delegate = EntityType.fromKey(id);
2025-04-12 14:10:54 +01:00
kyuri e2e0e292b7 Merge branch 'dev/7.0-2' into dev/7.0-2 2025-04-12 12:22:00 +01:00
ckyuri 227bfe7b29 Minestom Updated to latest version as of now 4/12/2025
Updated method names to new documentation and changed minestom versioning.

- Paper Build version was changed as I had issues building at all with the snapshot version. So it was changed to a generic version but everything still builds fine.
2025-04-12 11:54:48 +01:00
Mikal 52dc690243 Bukkit Build Fix (#494)
* Bukkit Build Fix

* remove comments

* remove papermc repo from gradle settings

* add back gradle shasum

* fix formatting, update gradle hash
2025-03-22 07:15:43 +00:00
Peter Pan d33d4af296 fix formatting, update gradle hash 2025-03-20 14:51:12 -04:00
Peter Pan fb0dbda296 add back gradle shasum 2025-03-20 11:01:41 -04:00
Peter Pan 4c860ca4ae remove papermc repo from gradle settings 2025-03-20 10:53:49 -04:00
Peter Pan b6e4543625 remove comments 2025-03-20 10:43:29 -04:00
Peter Pan 0921dfb204 Bukkit Build Fix 2025-03-19 15:54:11 -04:00
Zoë Gidiere 5892464a1d WIP Seismic Integration 2025-03-01 21:32:39 -07:00
Zoë Gidiere 8366a5288b fix minestom build 2025-03-01 15:45:30 -07:00
Zoë Gidiere d2b7384639 Merge branch 'master' into dev/7.0-2 2025-03-01 14:36:04 -07:00
Zoë Gidiere 8ffb09db36 Merge branch 'master' into dev/7.0-2 2025-02-28 11:36:23 -07:00
Zoe Gidiere ecbca608a5 Merge branch 'ver/6.6.0' into dev/7.0-2 2024-10-29 20:24:38 -06:00
Zoe Gidiere b4ab88a02e Fix allay reload 2024-10-29 16:13:29 -06:00
Zoe Gidiere ef1c9c125f Merge branch 'ver/6.6.0' into dev/7.0-2 2024-10-29 16:05:01 -06:00
Zoe Gidiere e665e187c1 Fix up merge 2024-10-29 16:00:39 -06:00
Zoe Gidiere bd28d8170c Merge branch 'ver/6.6.0' into dev/7.0-2 2024-10-29 15:56:30 -06:00
Zoe Gidiere d91e531fa5 fix allay 2024-10-25 16:28:00 -06:00
Zoe Gidiere 2a40f4af1e Merge branch 'ver/6.6.0' into dev/7.0-2 2024-10-25 16:14:54 -06:00
Zoe Gidiere d088d2f5a8 InlineVar 2024-10-25 15:59:38 -06:00
Zoe Gidiere 3d66386f99 Populate packs in a metapack under extended 2024-10-25 15:58:15 -06:00
Zoe Gidiere 1912d8e34c Fixup 2024-10-25 15:44:51 -06:00
Zoe Gidiere d48b610b39 Merge remote-tracking branch 'origin/ver/6.6.0' into dev/7.0-2 2024-10-25 15:21:47 -06:00
Zoe Gidiere dc6cfb4187 Merge branch 'ver/6.6.0' into dev/7.0-2 2024-10-12 15:43:58 -06:00
Zoe Gidiere cd2421bb49 Merge branch 'ver/6.6.0' into dev/7.0-2 2024-10-12 15:42:47 -06:00
Zoe Gidiere a82dcd579c Merge branch 'ver/6.6.0' into dev/7.0-2 2024-10-09 13:02:07 -06:00
Zoe Gidiere a20d2c1f60 Merge branch 'ver/6.6.0' into dev/7.0-2 2024-10-09 12:53:46 -06:00
Zoe Gidiere f5f3725dba Addon dependency updates 2024-09-25 15:47:19 -06:00
Zoe Gidiere a7a7354c40 remove 7.0 todo 2024-09-24 23:30:04 -06:00
Zoe Gidiere 42dcc9d9bd Merge remote-tracking branch 'origin/master' into dev/7.0-2 2024-09-24 23:29:52 -06:00
Zoe Gidiere 581651e83b reformat 2024-09-24 10:06:57 -06:00
Zoe Gidiere a95a1284a4 reformat 2024-09-24 09:54:53 -06:00
Zoe Gidiere c95b3c09a8 Merge branch 'ver/6.5.0' into dev/7.0-2 2024-09-24 09:44:35 -06:00
Zoe Gidiere 2df2755631 small opt 2024-09-21 17:20:28 -06:00
Zoe Gidiere ddb131d413 Merge remote-tracking branch 'origin/ver/6.5.0' into dev/7.0-2 2024-09-20 16:42:39 -06:00
Zoe Gidiere 2e145ccd0a Merge branch 'ver/6.5.0' into dev/7.0-2 2024-09-17 22:10:23 -06:00
Zoe Gidiere 0731d781d5 fix-up 2024-09-17 17:54:19 -06:00
Zoe Gidiere 5bc73dec37 Merge branch 'ver/6.5.0' into dev/7.0-2 2024-09-17 17:46:33 -06:00
duplexsystem b848ddabda Merge remote-tracking branch 'origin/ver/6.5.0' into dev/7.0-2 2024-03-02 22:18:54 -07:00
Zoë Gidiere 7214053b9e update fabric loader 2024-01-07 11:57:17 -07:00
Zoë Gidiere da5d0c52f2 Merge remote-tracking branch 'origin/ver/6.5.0' into dev/7.0-2 2024-01-07 10:55:39 -07:00
Zoë Gidiere cd69c7e77d bump version 2024-01-05 19:49:20 -07:00
Zoë Gidiere 56dd15c9aa clean up flora injection and make it configurable, off by default 2024-01-05 19:44:31 -07:00
Zoë Gidiere 2f470a3720 addon dep 2024-01-05 18:52:10 -07:00
Zoë Gidiere 5350917412 refactor v2 addons 2024-01-05 18:36:01 -07:00
Zoë Gidiere 45528acac8 update v2 addon tag 2024-01-05 18:34:55 -07:00
Zoë Gidiere 921212ccb5 Remove dump-resources and allow for ignoring specific resources 2024-01-05 17:19:27 -07:00
Zoë Gidiere 37641d43d6 Merge remote-tracking branch 'origin/ver/6.5.0' into dev/7.0-2 2024-01-05 15:14:23 -07:00
Zoë Gidiere 87ea5ce9e7 remove translation logic 2024-01-05 15:12:35 -07:00
Zoë Gidiere 77f766b8bb remove image and pipeline v1 2024-01-05 15:10:19 -07:00
Zoë Gidiere ecbba57b0a fix enum to uppcases 2024-01-05 15:01:36 -07:00
Zoë Gidiere 839835afd7 Add parameter to turn off salting cellular lookup
another updated astrash commit
2024-01-05 15:00:27 -07:00
Astrash 56941c237c Add meta annotations 2024-01-05 14:58:34 -07:00
Astrash 179a304cd2 Add default 'from' values for linear map template 2024-01-05 14:58:23 -07:00
Zoë Gidiere 4970bf5720 Implement linear map normalizer
Updated astrash commit
2024-01-05 14:58:07 -07:00
Zoë Gidiere f877f861cf use Ranges 2024-01-05 14:47:26 -07:00
Zoë Gidiere d5f0b69bc7 UX tweaks to biome config 2024-01-05 14:46:01 -07:00
Zoë Gidiere b10fd84e00 Merge remote-tracking branch 'origin/ver/6.5.0' into dev/metapacks 2024-01-05 09:11:42 -07:00
Zoë 3e04bae828 Merge branch 'ver/6.5.0' into dev/metapacks 2023-12-24 22:39:15 -06:00
Zoë 82334cfe9e Merge branch 'ver/6.5.0' into dev/metapacks 2023-12-22 15:03:04 -06:00
Zoë Gidiere 50ba1c6eab push changes 2023-12-21 08:47:52 -07:00
Zoë Gidiere 27a967f3a6 fix build 2023-12-12 20:17:15 -07:00
Zoë Gidiere 4c71355535 Reformat 2023-12-12 19:07:57 -07:00
Zoë Gidiere e83b70b5ae generation settings 2023-12-12 18:52:31 -07:00
Zoë Gidiere 56b428d501 refactor 2023-12-12 17:19:32 -07:00
Zoë Gidiere 7ca24faad3 fix loading 2023-12-12 17:15:54 -07:00
Zoë Gidiere 9d200565d7 more fixes 2023-12-12 16:54:27 -07:00
Zoë Gidiere f6c2795eaf remove debug loging 2023-12-12 16:12:36 -07:00
Zoë Gidiere 6f03746e41 another fix 2023-12-12 16:09:08 -07:00
Zoë Gidiere 47c8cb3168 Fix up random changes 2023-12-12 16:00:56 -07:00
Zoë Gidiere a9f973cae9 WIP Random Changes 2023-12-12 15:57:04 -07:00
Zoë Gidiere 033181d7c8 more wip changes 2023-12-12 15:48:31 -07:00
Zoë Gidiere e11a235386 WIP Dim opts 2023-12-12 13:55:03 -07:00
Zoë Gidiere db1e924246 more metapack work 2023-12-12 13:35:52 -07:00
Zoë Gidiere c86faa44ec Remove netherfossiloptimization because it's no longer applicable
also it's not needed mc seems to have done this themselves
2023-12-12 13:35:24 -07:00
Zoë Gidiere de91a6facb metapack linking instead of shading 2023-12-11 23:36:05 -07:00
Zoë Gidiere d4a328eb38 who let the datadrive (the dimensions) 2023-12-11 21:14:43 -07:00
Zoë Gidiere b039629b2d WIP meta pack system 2023-12-11 16:25:13 -07:00
Zoë Gidiere d48fa96ec7 opt import 2023-12-11 14:56:07 -07:00
Zoë Gidiere 8dd1f49b88 Merge remote-tracking branch 'origin/dev/remove-loader' into dev/metapacks 2023-12-11 14:54:59 -07:00
Zoë Gidiere 81528915a8 Merge branch 'ver/6.5.0' into dev/metapacks 2023-12-11 14:54:44 -07:00
Zoë Gidiere 5979254808 wip 2023-12-11 14:54:27 -07:00
Astrash c0aaf6c6e8 Add messages to exceptions 2023-11-28 10:36:30 +11:00
Astrash 1ab3233cba Reformat code 2023-11-25 15:14:16 +11:00
Astrash 59ea5a69d8 Refactor pack loading
- Combine initial load and reload logic together between each platform implementation
- Should prevent pack load errors from blocking other packs from loading.
2023-11-25 15:10:43 +11:00
Astrash 4ba71e9c27 packDirectory -> rootPath 2023-11-25 15:07:45 +11:00
Astrash 5c7441241c Replace Loader with java.nio.files 2023-11-25 13:31:42 +11:00
705 changed files with 7515 additions and 14569 deletions
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()
}
}
}
+3 -3
View File
@@ -1,8 +1,8 @@
preRelease(true)
versionProjects(":common:api", version("6.6.5"))
versionProjects(":common:implementation", version("6.6.5"))
versionProjects(":platforms", version("6.6.5"))
versionProjects(":common:api", version("7.0.0"))
versionProjects(":common:implementation", version("7.0.0"))
versionProjects(":platforms", version("7.0.0"))
allprojects {
+6 -6
View File
@@ -22,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
@@ -57,15 +57,6 @@ 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://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
}
}
}
+40 -32
View File
@@ -1,35 +1,39 @@
object Versions {
object Terra {
const val overworldConfig = "v1.5.2"
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 = "0.8.1"
const val tectonic = "4.3.1"
const val paralithic = "2.0.1"
const val strata = "1.3.2"
const val seismic = "2.5.7"
const val cloud = "2.0.0"
const val caffeine = "3.2.1"
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.1"
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.128.1+${Mod.minecraft}"
const val cloud = "2.0.0-beta.11"
const val fabricAPI = "0.134.1+${Mod.minecraft}"
const val cloud = "2.0.0-beta.13"
}
//
// object Quilt {
@@ -38,15 +42,15 @@ object Versions {
// }
object Mod {
const val mixin = "0.15.5+mixin.0.8.7"
const val mixinExtras = "0.4.1"
const val mixin = "0.16.4+mixin.0.8.7"
const val mixinExtras = "0.5.0"
const val minecraft = "1.21.7"
const val minecraft = "1.21.10"
const val yarn = "$minecraft+build.1"
const val fabricLoader = "0.16.14"
const val fabricLoader = "0.18.2"
const val architecuryLoom = "1.10.431"
const val architecturyPlugin = "3.4.161"
const val architecuryLoom = "1.11.451"
const val architecturyPlugin = "3.4.162"
}
//
@@ -56,16 +60,17 @@ object Versions {
// }
object Bukkit {
const val minecraft = "1.21.7-R0.1"
const val paperBuild = "$minecraft-20250630.144242-1"
const val minecraft = "1.21.10"
const val nms = "$minecraft-R0.1"
const val paperBuild = "$nms-20251012.013929-7"
const val paper = paperBuild
const val paperLib = "1.0.8"
const val reflectionRemapper = "0.1.2"
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 multiverse = "5.0.2"
const val paperWeight = "2.0.0-beta.19"
const val cloud = "2.0.0-beta.12"
const val multiverse = "5.3.0"
}
//
@@ -76,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_6-c3ccee696b"
const val minestom = "2025.10.04-1.21.8"
}
}
@@ -15,7 +15,7 @@ public class ApiAddon implements BaseAddon {
}
@Override
public Version getVersion() {
public Version version() {
return version;
}
@@ -33,7 +33,7 @@ public class ApiAddonLoader implements BootstrapBaseAddon<BaseAddon> {
}
@Override
public Version getVersion() {
public Version version() {
return VERSION;
}
}
@@ -66,12 +66,12 @@ public class ManifestAddon implements BaseAddon {
}
@Override
public Map<String, VersionRange> getDependencies() {
public Map<String, VersionRange> dependencies() {
return manifest.getDependencies();
}
@Override
public Version getVersion() {
public Version version() {
return manifest.getVersion();
}
}
@@ -132,7 +132,7 @@ public class ManifestAddonLoader implements BootstrapBaseAddon<ManifestAddon> {
}
@Override
public Version getVersion() {
public Version version() {
return VERSION;
}
}
@@ -0,0 +1,5 @@
version = version("1.0.0")
dependencies {
compileOnlyApi(project(":common:addons:addon-loader-manifest"))
}
@@ -1,7 +1,7 @@
schema-version: 1
contributors:
- Terra contributors
id: biome-query-api
id: api-biome-query
version: @VERSION@
entrypoints:
- "com.dfsek.terra.addons.biome.query.BiomeQueryAPIAddon"
+7
View File
@@ -0,0 +1,7 @@
version = version("1.1.0")
dependencies {
compileOnlyApi(project(":common:addons:addon-loader-manifest"))
}
@@ -1,5 +1,6 @@
package com.dfsek.terra.addons.image;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.function.Supplier;
@@ -15,8 +16,8 @@ import com.dfsek.terra.addons.image.config.colorsampler.mutate.RotateColorSample
import com.dfsek.terra.addons.image.config.colorsampler.mutate.TranslateColorSamplerTemplate;
import com.dfsek.terra.addons.image.config.image.ImageTemplate;
import com.dfsek.terra.addons.image.config.image.StitchedImageTemplate;
import com.dfsek.terra.addons.image.config.noisesampler.ChannelNoiseSamplerTemplate;
import com.dfsek.terra.addons.image.config.noisesampler.DistanceTransformNoiseSamplerTemplate;
import com.dfsek.terra.addons.image.config.sampler.ChannelSamplerTemplate;
import com.dfsek.terra.addons.image.config.sampler.DistanceTransformSamplerTemplate;
import com.dfsek.terra.addons.image.image.Image;
import com.dfsek.terra.addons.image.operator.DistanceTransform;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
@@ -26,7 +27,6 @@ import com.dfsek.terra.api.config.ConfigPack;
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.noise.NoiseSampler;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.reflection.TypeKey;
@@ -39,7 +39,7 @@ public class ImageLibraryAddon implements AddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<ColorSampler>>> COLOR_PICKER_REGISTRY_KEY = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<NoiseSampler>>> NOISE_SAMPLER_TOKEN = new TypeKey<>() {
public static final TypeKey<Supplier<ObjectTemplate<Sampler>>> NOISE_SAMPLER_TOKEN = new TypeKey<>() {
};
@Inject
private Platform platform;
@@ -60,8 +60,8 @@ public class ImageLibraryAddon implements AddonInitializer {
.then(event -> {
ConfigPack pack = event.getPack();
CheckedRegistry<Supplier<ObjectTemplate<Image>>> imageRegistry = pack.getOrCreateRegistry(IMAGE_REGISTRY_KEY);
imageRegistry.register(addon.key("BITMAP"), () -> new ImageTemplate(pack.getLoader(), pack));
imageRegistry.register(addon.key("STITCHED_BITMAP"), () -> new StitchedImageTemplate(pack.getLoader(), pack));
imageRegistry.register(addon.key("BITMAP"), () -> new ImageTemplate(pack));
imageRegistry.register(addon.key("STITCHED_BITMAP"), () -> new StitchedImageTemplate(pack));
})
.then(event -> {
event.getPack()
@@ -71,10 +71,10 @@ public class ImageLibraryAddon implements AddonInitializer {
(type, o, loader, depthTracker) -> DistanceTransform.Normalization.valueOf((String) o))
.applyLoader(ColorString.class, new ColorLoader());
CheckedRegistry<Supplier<ObjectTemplate<NoiseSampler>>> noiseRegistry = event.getPack().getOrCreateRegistry(
CheckedRegistry<Supplier<ObjectTemplate<Sampler>>> noiseRegistry = event.getPack().getOrCreateRegistry(
NOISE_SAMPLER_TOKEN);
noiseRegistry.register(addon.key("DISTANCE_TRANSFORM"), DistanceTransformNoiseSamplerTemplate::new);
noiseRegistry.register(addon.key("CHANNEL"), ChannelNoiseSamplerTemplate::new);
noiseRegistry.register(addon.key("DISTANCE_TRANSFORM"), DistanceTransformSamplerTemplate::new);
noiseRegistry.register(addon.key("CHANNEL"), ChannelSamplerTemplate::new);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<ColorSampler>>> colorSamplerRegistry = event.getPack().getOrCreateRegistry(
@@ -1,7 +1,8 @@
package com.dfsek.terra.addons.image.colorsampler.mutate;
import com.dfsek.seismic.math.trigonometry.TrigonometryFunctions;
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
import com.dfsek.terra.api.util.MathUtil;
public class RotateColorSampler implements ColorSampler {
@@ -39,14 +40,14 @@ public class RotateColorSampler implements ColorSampler {
case DEG_90 -> -z;
case DEG_180 -> -x;
case DEG_270 -> z;
case RAD_ANY -> (int) (x * MathUtil.cos(radians) - z * MathUtil.sin(radians));
case RAD_ANY -> (int) (x * TrigonometryFunctions.cos(radians) - z * TrigonometryFunctions.sin(radians));
};
int rz = switch(rotationMethod) {
case DEG_0 -> z;
case DEG_90 -> x;
case DEG_180 -> -z;
case DEG_270 -> -x;
case RAD_ANY -> (int) (z * MathUtil.cos(radians) + x * MathUtil.sin(radians));
case RAD_ANY -> (int) (z * TrigonometryFunctions.cos(radians) + x * TrigonometryFunctions.sin(radians));
};
return sampler.apply(rx, rz);
}
@@ -2,10 +2,13 @@ package com.dfsek.terra.addons.image.config.image;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.github.benmanes.caffeine.cache.Scheduler;
import javax.imageio.ImageIO;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.concurrent.TimeUnit;
import com.dfsek.terra.addons.image.config.ImageLibraryPackConfigTemplate;
@@ -13,11 +16,8 @@ import com.dfsek.terra.addons.image.image.BufferedImageWrapper;
import com.dfsek.terra.addons.image.image.Image;
import com.dfsek.terra.addons.image.image.SuppliedImage;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.config.Loader;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.util.generic.Lazy;
import com.github.benmanes.caffeine.cache.Scheduler;
import com.dfsek.terra.api.util.generic.Memo;
import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR;
@@ -26,13 +26,13 @@ import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR;
* Cache prevents configs from loading the same image multiple times into memory
*/
record ImageCache(LoadingCache<String, Image> cache) implements Properties {
public static Image load(String path, ConfigPack pack, Loader files) throws IOException {
public static Image load(String path, ConfigPack pack) throws IOException {
ImageLibraryPackConfigTemplate config = pack.getContext().get(ImageLibraryPackConfigTemplate.class);
ImageCache images;
if(!pack.getContext().has(ImageCache.class)) {
var cacheBuilder = Caffeine.newBuilder().executor(CACHE_EXECUTOR).scheduler(Scheduler.systemScheduler());
if(config.unloadOnTimeout()) cacheBuilder.expireAfterAccess(config.getCacheTimeout(), TimeUnit.SECONDS);
images = new ImageCache(cacheBuilder.build(s -> loadImage(s, files)));
images = new ImageCache(cacheBuilder.build(s -> loadImage(s, pack.getRootPath())));
pack.getContext().put(images);
} else images = pack.getContext().get(ImageCache.class);
@@ -41,7 +41,7 @@ record ImageCache(LoadingCache<String, Image> cache) implements Properties {
return new SuppliedImage(() -> images.cache.get(path));
} else {
// If images do not time out, image can be lazily loaded once instead of performing cache lookups for each image operation
Lazy<Image> lazyImage = Lazy.lazy(() -> images.cache.get(path));
Memo<Image> lazyImage = Memo.lazy(() -> images.cache.get(path));
return new SuppliedImage(lazyImage::value);
}
}
@@ -49,17 +49,8 @@ record ImageCache(LoadingCache<String, Image> cache) implements Properties {
return images.cache.get(path);
}
private static Image loadImage(String path, Loader files) throws IOException {
try {
return new BufferedImageWrapper(ImageIO.read(files.get(path)));
} catch(IllegalArgumentException e) {
throw new IllegalArgumentException("Unable to load image (image might be too large?)", e);
} catch(IOException e) {
if(e instanceof FileNotFoundException) {
// Rethrow using nicer message
throw new IOException("Unable to load image: No such file or directory: " + path, e);
}
throw new IOException("Unable to load image", e);
}
private static Image loadImage(String path, Path directory) throws IOException {
InputStream is = Files.newInputStream(directory.resolve(path));
return new BufferedImageWrapper(ImageIO.read(is));
}
}
@@ -7,25 +7,22 @@ import java.io.IOException;
import com.dfsek.terra.addons.image.image.Image;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.config.Loader;
public class ImageTemplate implements ObjectTemplate<Image> {
private final Loader files;
private final ConfigPack pack;
@Value("path")
private String path;
public ImageTemplate(Loader files, ConfigPack pack) {
this.files = files;
public ImageTemplate(ConfigPack pack) {
this.pack = pack;
}
@Override
public Image get() {
try {
return ImageCache.load(path, pack, files);
return ImageCache.load(path, pack);
} catch(IOException e) {
throw new RuntimeException(e);
}
@@ -11,12 +11,10 @@ import java.io.IOException;
import com.dfsek.terra.addons.image.image.Image;
import com.dfsek.terra.addons.image.image.StitchedImage;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.config.Loader;
public class StitchedImageTemplate implements ObjectTemplate<Image>, ValidatedConfigTemplate {
private final Loader files;
private final ConfigPack pack;
@Value("path-format")
private String path;
@@ -28,8 +26,7 @@ public class StitchedImageTemplate implements ObjectTemplate<Image>, ValidatedCo
@Default
private boolean zeroIndexed = false;
public StitchedImageTemplate(Loader files, ConfigPack pack) {
this.files = files;
public StitchedImageTemplate(ConfigPack pack) {
this.pack = pack;
}
@@ -39,7 +36,7 @@ public class StitchedImageTemplate implements ObjectTemplate<Image>, ValidatedCo
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
try {
grid[i][j] = ImageCache.load(getFormattedPath(i, j), pack, files);
grid[i][j] = ImageCache.load(getFormattedPath(i, j), pack);
} catch(IOException e) {
throw new RuntimeException(e);
}
@@ -1,16 +1,16 @@
package com.dfsek.terra.addons.image.config.noisesampler;
package com.dfsek.terra.addons.image.config.sampler;
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.addons.image.colorsampler.ColorSampler;
import com.dfsek.terra.addons.image.noisesampler.ChannelNoiseSampler;
import com.dfsek.terra.addons.image.sampler.ChannelSampler;
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
import com.dfsek.terra.api.noise.NoiseSampler;
public class ChannelNoiseSamplerTemplate implements ObjectTemplate<NoiseSampler> {
public class ChannelSamplerTemplate implements ObjectTemplate<Sampler> {
@Value("color-sampler")
private ColorSampler colorSampler;
@@ -35,7 +35,7 @@ public class ChannelNoiseSamplerTemplate implements ObjectTemplate<NoiseSampler>
private boolean premultiply = false;
@Override
public NoiseSampler get() {
return new ChannelNoiseSampler(colorSampler, channel, normalize, premultiply);
public Sampler get() {
return new ChannelSampler(colorSampler, channel, normalize, premultiply);
}
}
@@ -1,5 +1,6 @@
package com.dfsek.terra.addons.image.config.noisesampler;
package com.dfsek.terra.addons.image.config.sampler;
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;
@@ -9,10 +10,9 @@ import com.dfsek.terra.addons.image.operator.DistanceTransform;
import com.dfsek.terra.addons.image.operator.DistanceTransform.CostFunction;
import com.dfsek.terra.addons.image.operator.DistanceTransform.Normalization;
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
import com.dfsek.terra.api.noise.NoiseSampler;
public class DistanceTransformNoiseSamplerTemplate implements ObjectTemplate<NoiseSampler> {
public class DistanceTransformSamplerTemplate implements ObjectTemplate<Sampler> {
@Value("image")
private Image image;
@@ -68,7 +68,7 @@ public class DistanceTransformNoiseSamplerTemplate implements ObjectTemplate<Noi
private Normalization normalization = Normalization.None;
@Override
public NoiseSampler get() {
public Sampler get() {
return new DistanceTransform.Noise(new DistanceTransform(image, channel, threshold, clampToEdge, costFunction, invertThreshold),
normalization);
}
@@ -1,9 +1,11 @@
package com.dfsek.terra.addons.image.operator;
import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.addons.image.image.Image;
import com.dfsek.terra.addons.image.util.ColorUtil;
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
import com.dfsek.terra.api.noise.NoiseSampler;
import static com.dfsek.terra.addons.image.util.MathUtil.lerp;
@@ -220,7 +222,7 @@ public class DistanceTransform {
}
public static class Noise implements NoiseSampler {
public static class Noise implements Sampler {
private final DistanceTransform transform;
@@ -230,14 +232,14 @@ public class DistanceTransform {
}
@Override
public double noise(long seed, double x, double y) {
public double getSample(long seed, double x, double y) {
if(x < 0 || y < 0 || x >= transform.width || y >= transform.height) return transform.minDistance;
return transform.distances[(int) Math.floor(x)][(int) Math.floor(y)];
return transform.distances[FloatingPointFunctions.floor(x)][FloatingPointFunctions.floor(y)];
}
@Override
public double noise(long seed, double x, double y, double z) {
return noise(seed, x, z);
public double getSample(long seed, double x, double y, double z) {
return getSample(seed, x, z);
}
}
}
@@ -1,14 +1,15 @@
package com.dfsek.terra.addons.image.noisesampler;
package com.dfsek.terra.addons.image.sampler;
import com.dfsek.seismic.type.sampler.Sampler;
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
import com.dfsek.terra.addons.image.util.ColorUtil;
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
import com.dfsek.terra.api.noise.NoiseSampler;
import static com.dfsek.terra.addons.image.util.MathUtil.lerp;
public class ChannelNoiseSampler implements NoiseSampler {
public class ChannelSampler implements Sampler {
private final ColorSampler colorSampler;
@@ -18,7 +19,7 @@ public class ChannelNoiseSampler implements NoiseSampler {
private final boolean premultiply;
public ChannelNoiseSampler(ColorSampler colorSampler, Channel channel, boolean normalize, boolean premultiply) {
public ChannelSampler(ColorSampler colorSampler, Channel channel, boolean normalize, boolean premultiply) {
this.colorSampler = colorSampler;
this.channel = channel;
this.normalize = normalize;
@@ -26,7 +27,7 @@ public class ChannelNoiseSampler implements NoiseSampler {
}
@Override
public double noise(long seed, double x, double y) {
public double getSample(long seed, double x, double y) {
int sample = colorSampler.apply((int) x, (int) y);
int premultiplied = premultiply ? ColorUtil.premultiply(sample) : sample;
double channelValue = channel.from(premultiplied);
@@ -34,7 +35,7 @@ public class ChannelNoiseSampler implements NoiseSampler {
}
@Override
public double noise(long seed, double x, double y, double z) {
return noise(seed, x, z);
public double getSample(long seed, double x, double y, double z) {
return getSample(seed, x, z);
}
}
@@ -1,7 +1,7 @@
schema-version: 1
contributors:
- Terra contributors
id: library-image
id: api-image
version: @VERSION@
entrypoints:
- "com.dfsek.terra.addons.image.ImageLibraryAddon"
@@ -1,6 +1,6 @@
version = version("1.0.0")
dependencies {
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
compileOnlyApi(project(":common:addons:biome-query-api"))
compileOnlyApi(project(":common:addons:addon-loader-manifest"))
compileOnlyApi(project(":common:addons:api-biome-query"))
}
@@ -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,48 +6,45 @@ 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.util.generic.data.types.Maybe;
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
public Column<Biome> getColumn(int x, int z, long seed, int min, int max) {
return delegate.getBaseBiome(x, z, seed)
.map(base -> (Column<Biome>) new BaseBiomeColumn(this, base, min, max, x, z, seed))
.orElseGet(() -> BiomeProvider.super.getColumn(x, z, seed, min, max));
.get(() -> BiomeProvider.super.getColumn(x, z, seed, min, max));
}
@Override
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
public Maybe<Biome> getBaseBiome(int x, int z, long seed) {
return delegate.getBaseBiome(x, z, seed);
}
@@ -64,4 +61,4 @@ public class BiomeExtrusionProvider implements BiomeProvider {
public BiomeProvider getDelegate() {
return delegate;
}
}
}
@@ -1,9 +1,9 @@
package com.dfsek.terra.addons.biome.extrusion.api;
import com.dfsek.terra.api.world.biome.Biome;
import java.util.Collection;
import com.dfsek.terra.api.world.biome.Biome;
public interface Extrusion {
Biome extrude(Biome original, int x, int y, int z, long seed);
@@ -27,6 +27,6 @@ public class ReplaceableBiomeLoader implements TypeLoader<ReplaceableBiome> {
return biomeRegistry
.getByID((String) c)
.map(ReplaceableBiome::of)
.orElseThrow(() -> new LoadException("No such biome: " + c, depthTracker));
.collectThrow(left -> new LoadException("No such biome: " + c + ": " + left, depthTracker));
}
}
@@ -1,17 +1,17 @@
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.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.range.Range;
public abstract class SamplerExtrusionTemplate implements ObjectTemplate<Extrusion> {
@Value("sampler")
protected @Meta NoiseSampler sampler;
protected @Meta Sampler sampler;
@Value("range")
protected @Meta 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.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.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;
@@ -17,26 +19,42 @@ import com.dfsek.terra.api.world.biome.Biome;
* Sets biomes at locations based on a sampler.
*/
public class ReplaceExtrusion implements Extrusion {
private final NoiseSampler sampler;
private final Sampler sampler;
private final Range range;
private final ProbabilityCollection<ReplaceableBiome> biomes;
private final Predicate<Biome> hasTag;
private final TriStateIntCache cache;
public ReplaceExtrusion(NoiseSampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes, String tag) {
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.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.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;
@@ -16,13 +17,13 @@ import com.dfsek.terra.api.world.biome.Biome;
* Sets biomes at locations based on a sampler.
*/
public class SetExtrusion implements Extrusion {
private final NoiseSampler sampler;
private final Sampler sampler;
private final Range range;
private final ProbabilityCollection<ReplaceableBiome> biomes;
public SetExtrusion(NoiseSampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes) {
public SetExtrusion(Sampler sampler, Range range, ProbabilityCollection<ReplaceableBiome> biomes) {
this.sampler = sampler;
this.range = range;
this.biomes = biomes;
@@ -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);
}
}
}
@@ -11,4 +11,4 @@ website:
docs: https://terra.polydev.org
license: MIT License
depends:
biome-query-api: "1.+"
api-biome-query: "1.+"
@@ -1,5 +0,0 @@
# biome-provider-image-v2
Implements and registers the `IMAGE` biome provider, which
utilizes various config types provided by the `library-image` addon to
distribute biomes based on images.
@@ -1,8 +0,0 @@
version = version("1.0.1")
dependencies {
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
compileOnlyApi(project(":common:addons:library-image"))
}
@@ -1,51 +0,0 @@
/*
* Copyright (c) 2020-2025 Polyhedral Development
*
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
* reference the LICENSE file in this module's root directory.
*/
package com.dfsek.terra.addons.biome.image.v2;
import java.util.Optional;
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
import com.dfsek.terra.addons.image.converter.ColorConverter;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class ImageBiomeProvider implements BiomeProvider {
private final int resolution;
private final ColorConverter<Biome> colorConverter;
private final ColorSampler colorSampler;
public ImageBiomeProvider(ColorConverter<Biome> colorConverter, ColorSampler colorSampler, int resolution) {
this.resolution = resolution;
this.colorConverter = colorConverter;
this.colorSampler = colorSampler;
}
@Override
public Biome getBiome(int x, int y, int z, long seed) {
return getBiome(x, z);
}
public Biome getBiome(int x, int z) {
x /= resolution;
z /= resolution;
return colorConverter.apply(colorSampler.apply(x, z));
}
@Override
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
return Optional.of(getBiome(x, z));
}
@Override
public Iterable<Biome> getBiomes() {
return colorConverter.getEntries();
}
}
@@ -1,78 +0,0 @@
/*
* Copyright (c) 2020-2025 Polyhedral Development
*
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
* reference the LICENSE file in this module's root directory.
*/
package com.dfsek.terra.addons.biome.image.v2;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.function.Supplier;
import com.dfsek.terra.addons.biome.image.v2.config.ImageProviderTemplate;
import com.dfsek.terra.addons.biome.image.v2.config.converter.ClosestBiomeColorConverterTemplate;
import com.dfsek.terra.addons.biome.image.v2.config.converter.ExactBiomeColorConverterTemplate;
import com.dfsek.terra.addons.biome.image.v2.config.converter.mapping.DefinedBiomeColorMappingTemplate;
import com.dfsek.terra.addons.image.converter.ColorConverter;
import com.dfsek.terra.addons.image.converter.mapping.BiomeDefinedColorMapping;
import com.dfsek.terra.addons.image.converter.mapping.ColorMapping;
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.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.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class ImageBiomeProviderAddon implements AddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<ColorConverter<Biome>>>> BIOME_COLOR_CONVERTER_REGISTRY_KEY = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<ColorMapping<Biome>>>> BIOME_COLOR_MAPPING_REGISTRY_KEY = new TypeKey<>() {
};
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override
public void initialize() {
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPreLoadEvent.class)
.priority(501)
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
PROVIDER_REGISTRY_KEY);
providerRegistry.register(addon.key("IMAGE"), ImageProviderTemplate::new);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<ColorConverter<Biome>>>> biomeColorConverterRegistry =
event.getPack().getOrCreateRegistry(
BIOME_COLOR_CONVERTER_REGISTRY_KEY);
biomeColorConverterRegistry.register(addon.key("EXACT"), ExactBiomeColorConverterTemplate::new);
biomeColorConverterRegistry.register(addon.key("CLOSEST"), ClosestBiomeColorConverterTemplate::new);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<ColorMapping<Biome>>>> biomeColorMappingRegistry =
event.getPack().getOrCreateRegistry(
BIOME_COLOR_MAPPING_REGISTRY_KEY);
biomeColorMappingRegistry.register(addon.key("USE_BIOME_COLORS"),
() -> () -> new BiomeDefinedColorMapping<>(event.getPack().getRegistry(Biome.class),
b -> b));
biomeColorMappingRegistry.register(addon.key("MAP"), DefinedBiomeColorMappingTemplate::new);
})
.failThrough();
}
}
+4 -5
View File
@@ -1,6 +1,5 @@
# biome-provider-image
# biome-provider-image-v2
Implements and registers the `IMAGE` biome provider, a biome provider which
generates biomes from an image, using the `color` attribute of biomes.
This addon registers the provider type, and all associated config options.
Implements and registers the `IMAGE` biome provider, which
utilizes various config types provided by the `api-image` addon to
distribute biomes based on images.
@@ -1,7 +1,8 @@
version = version("1.0.1")
version = version("2.0.0")
dependencies {
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
compileOnlyApi(project(":common:addons:addon-loader-manifest"))
compileOnlyApi(project(":common:addons:api-image"))
}
@@ -7,32 +7,26 @@
package com.dfsek.terra.addons.biome.image;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
import com.dfsek.terra.addons.image.converter.ColorConverter;
import com.dfsek.terra.api.util.generic.data.types.Maybe;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class ImageBiomeProvider implements BiomeProvider {
private final Map<Color, Biome> colorBiomeMap = new HashMap<>();
private final BufferedImage image;
private final int resolution;
private final Align align;
public ImageBiomeProvider(Set<Biome> registry, BufferedImage image, int resolution, Align align) {
this.image = image;
private final ColorConverter<Biome> colorConverter;
private final ColorSampler colorSampler;
public ImageBiomeProvider(ColorConverter<Biome> colorConverter, ColorSampler colorSampler, int resolution) {
this.resolution = resolution;
this.align = align;
registry.forEach(biome -> colorBiomeMap.put(new Color(biome.getColor()), biome));
}
private static int distance(Color a, Color b) {
return Math.abs(a.getRed() - b.getRed()) + Math.abs(a.getGreen() - b.getGreen()) + Math.abs(a.getBlue() - b.getBlue());
this.colorConverter = colorConverter;
this.colorSampler = colorSampler;
}
@Override
@@ -43,42 +37,16 @@ public class ImageBiomeProvider implements BiomeProvider {
public Biome getBiome(int x, int z) {
x /= resolution;
z /= resolution;
Color color = align.getColor(image, x, z);
return colorBiomeMap.get(colorBiomeMap.keySet()
.stream()
.reduce(colorBiomeMap.keySet().stream().findAny().orElseThrow(IllegalStateException::new),
(running, element) -> {
int d1 = distance(color, running);
int d2 = distance(color, element);
return d1 < d2 ? running : element;
}));
return colorConverter.apply(colorSampler.apply(x, z));
}
@Override
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
return Optional.of(getBiome(x, z));
public Maybe<Biome> getBaseBiome(int x, int z, long seed) {
return Maybe.just(getBiome(x, z));
}
@Override
public Iterable<Biome> getBiomes() {
return colorBiomeMap.values();
}
public enum Align {
CENTER {
@Override
public Color getColor(BufferedImage image, int x, int z) {
return new Color(image.getRGB(Math.floorMod(x - image.getWidth() / 2, image.getWidth()),
Math.floorMod(z - image.getHeight() / 2, image.getHeight())));
}
},
NONE {
@Override
public Color getColor(BufferedImage image, int x, int z) {
return new Color(image.getRGB(Math.floorMod(x, image.getWidth()), Math.floorMod(z, image.getHeight())));
}
};
public abstract Color getColor(BufferedImage image, int x, int z);
return colorConverter.getEntries();
}
}
@@ -8,11 +8,16 @@
package com.dfsek.terra.addons.biome.image;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
import com.dfsek.terra.addons.biome.image.config.converter.mapping.DefinedBiomeColorMappingTemplate;
import com.dfsek.terra.addons.image.converter.ColorConverter;
import com.dfsek.terra.addons.image.converter.mapping.BiomeDefinedColorMapping;
import com.dfsek.terra.addons.image.converter.mapping.ColorMapping;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon;
@@ -26,10 +31,15 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class ImageBiomeProviderAddon implements AddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
};
private static final Logger logger = LoggerFactory.getLogger(ImageBiomeProviderAddon.class);
public static final TypeKey<Supplier<ObjectTemplate<ColorConverter<Biome>>>> BIOME_COLOR_CONVERTER_REGISTRY_KEY = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<ColorMapping<Biome>>>> BIOME_COLOR_MAPPING_REGISTRY_KEY = new TypeKey<>() {
};
@Inject
private Platform platform;
@@ -41,16 +51,28 @@ public class ImageBiomeProviderAddon implements AddonInitializer {
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPreLoadEvent.class)
.priority(501)
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
PROVIDER_REGISTRY_KEY);
providerRegistry.register(addon.key("IMAGE"),
() -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class)));
providerRegistry.register(addon.key("IMAGE"), ImageProviderTemplate::new);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<ColorConverter<Biome>>>> biomeColorConverterRegistry =
event.getPack().getOrCreateRegistry(
BIOME_COLOR_CONVERTER_REGISTRY_KEY);
biomeColorConverterRegistry.register(addon.key("EXACT"), ExactBiomeColorConverterTemplate::new);
biomeColorConverterRegistry.register(addon.key("CLOSEST"), ClosestBiomeColorConverterTemplate::new);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<ColorMapping<Biome>>>> biomeColorMappingRegistry =
event.getPack().getOrCreateRegistry(
BIOME_COLOR_MAPPING_REGISTRY_KEY);
biomeColorMappingRegistry.register(addon.key("USE_BIOME_COLORS"),
() -> () -> new BiomeDefinedColorMapping<>(event.getPack().getRegistry(Biome.class),
b -> b));
biomeColorMappingRegistry.register(addon.key("MAP"), DefinedBiomeColorMappingTemplate::new);
})
.failThrough();
if(platform.getTerraConfig().isDebugLog())
logger.warn(
"The biome-provider-image addon is deprecated and scheduled for removal in Terra 7.0. It is recommended to use the " +
"biome-provider-image-v2 addon for future pack development instead.");
}
}
@@ -1,45 +0,0 @@
/*
* Copyright (c) 2020-2025 Polyhedral Development
*
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
* reference the LICENSE file in this module's root directory.
*/
package com.dfsek.terra.addons.biome.image;
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;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.awt.image.BufferedImage;
import java.util.HashSet;
import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
@SuppressWarnings("FieldMayBeFinal")
public class ImageProviderTemplate implements ObjectTemplate<BiomeProvider> {
private final Registry<Biome> biomes;
@Value("resolution")
@Default
@Description("Sets the resolution at which to sample the image.")
private int resolution = 1;
@Value("image.name")
@Description("Sets the location of the image on the filesystem, relative to the pack root.")
private BufferedImage image;
@Value("image.align")
@Description("Sets the alignment style to use for the image.")
private ImageBiomeProvider.Align align;
public ImageProviderTemplate(Registry<Biome> set) {
this.biomes = set;
}
@Override
public BiomeProvider get() {
return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align);
}
}
@@ -5,14 +5,14 @@
* reference the LICENSE file in this module's root directory.
*/
package com.dfsek.terra.addons.biome.image.v2.config;
package com.dfsek.terra.addons.biome.image.config;
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;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.biome.image.v2.ImageBiomeProvider;
import com.dfsek.terra.addons.biome.image.ImageBiomeProvider;
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
import com.dfsek.terra.addons.image.converter.ColorConverter;
import com.dfsek.terra.api.world.biome.Biome;
@@ -1,4 +1,4 @@
package com.dfsek.terra.addons.biome.image.v2.config.converter;
package com.dfsek.terra.addons.biome.image.config.converter;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.addons.biome.image.v2.config.converter;
package com.dfsek.terra.addons.biome.image.config.converter;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.addons.biome.image.v2.config.converter.mapping;
package com.dfsek.terra.addons.biome.image.config.converter.mapping;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;

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