Compare commits

...

571 Commits

Author SHA1 Message Date
dfsek dd86664e5e create TerraScriptAPIAddon 2021-08-10 09:32:09 -07:00
dfsek b9ac23baba remove unused classes 2021-08-10 09:22:41 -07:00
dfsek c620c17ac6 remove ImplementationArguments 2021-08-10 09:15:18 -07:00
dfsek c1232298b3 replace implementation arguments with context 2021-08-10 09:14:47 -07:00
dfsek 373f6a5fe3 switch terrascript items to use context 2021-08-08 12:29:55 -07:00
dfsek fb505fe28b constant returnable helper method 2021-08-08 12:22:54 -07:00
dfsek 3594beb406 refactor terrascript into API, loader, and function addons 2021-08-08 12:20:26 -07:00
dfsek 2b142b282f delete unused class 2021-08-03 13:00:51 -07:00
dfsek f1bda5c907 reformat + imports 2021-08-03 12:59:58 -07:00
dfsek dca8dd4c4f organize language API 2021-08-03 12:56:52 -07:00
dfsek 54335bfd70 refactor Function and FunctionBuilder 2021-08-03 12:55:51 -07:00
dfsek ddbae360c3 refactor ParseException 2021-08-03 12:54:47 -07:00
dfsek 9718c99149 refactor Item to api addon 2021-08-03 12:53:40 -07:00
dfsek 32cc38c6b2 depend on function api in test 2021-08-03 12:51:49 -07:00
dfsek 965d0681eb depend on terrascript api 2021-08-03 12:48:29 -07:00
dfsek f137fe2b7a create api-terrascript addon 2021-08-03 12:43:24 -07:00
dfsek 72a4909145 create terrascript functions addon 2021-08-03 12:40:52 -07:00
dfsek 5919d5f031 create "merged" platform 2021-08-02 23:29:29 -07:00
dfsek 03241fa412 register event listeners 2021-07-31 00:56:45 -07:00
dfsek 9eecaf71c8 hold air blockstate in Lazy 2021-07-31 00:46:33 -07:00
dfsek f5c73e926f remove mixin stuff for now 2021-07-31 00:44:06 -07:00
dfsek bea45ff030 begin sponge impl 2021-07-30 15:23:39 -07:00
dfsek 2263e6722b set up mixin and vanillagradle 2021-07-30 10:53:22 -07:00
dfsek df6cdf37aa reset sponge build 2021-07-30 10:45:24 -07:00
dfsek 6010ea3bd6 bump test version to 1.17.1 2021-07-30 10:25:58 -07:00
dfsek c8429141c8 fix class cast issue 2021-07-30 10:23:09 -07:00
dfsek a15c5f2cca shade ioutils in terrascript addon 2021-07-30 10:17:17 -07:00
dfsek 7becdf7f64 dont delete addons in bukkit build 2021-07-30 08:40:27 -07:00
dfsek 76173c1f31 correct bukkit addon dirs 2021-07-30 08:37:47 -07:00
dfsek 3a47fd5aa9 fire initialization event on bukkit 2021-07-30 08:37:12 -07:00
dfsek ddf1334f6f properly initialize config.yml 2021-07-30 08:25:35 -07:00
dfsek bda3594025 addon dump bukkit 2021-07-30 08:14:01 -07:00
dfsek 1dbcb031ea move resource dumping to AbstractTerraPlugin 2021-07-30 08:09:37 -07:00
dfsek b407ca8821 move platform addon registration 2021-07-30 07:56:18 -07:00
dfsek 0b0742d850 compile bukkit 2021-07-29 10:44:49 -07:00
dfsek 102828039d split up bukkit terraplugin impl 2021-07-29 09:32:41 -07:00
dfsek a21eb2c3ba fix deprecation warning on bukkit 2021-07-29 08:24:36 -07:00
dfsek 43874521db remove jcenter from buildscripts 2021-07-29 08:22:41 -07:00
dfsek 7f7dc23b09 Merge pull request #254 from PolyhedralDev/dev/addon-splits
Implement other biome provider types, streamline pipeline config syntax, implement more locators
2021-07-29 08:11:03 -07:00
dfsek a2d8a5a259 implement ImageBiomeProviderAddon 2021-07-29 08:06:41 -07:00
dfsek 1c5945706f implement single biome provider addon 2021-07-29 08:01:12 -07:00
dfsek 480e41b99a register biome provider types 2021-07-29 07:56:21 -07:00
dfsek 276c78a329 remove StageLoader 2021-07-29 07:48:43 -07:00
dfsek dd0ef7ea45 register all stage types 2021-07-29 07:47:56 -07:00
dfsek d5fd653130 register stages 2021-07-29 07:38:41 -07:00
dfsek 6da14f58df remove BiomeSource.Type 2021-07-29 07:28:09 -07:00
dfsek 13ab02984b remove SourceLoader 2021-07-29 07:27:30 -07:00
dfsek fa8a66833e register biome sources 2021-07-29 07:27:00 -07:00
dfsek 9d24e8a282 remove unneeded TypeKeys 2021-07-29 07:23:05 -07:00
dfsek 6df5aa112a register noise locator 2021-07-28 09:15:02 -07:00
dfsek dd0c6b557d implement NoiseLocatorTemplate 2021-07-28 09:14:37 -07:00
dfsek 1522e6b57d implement NoiseLocator 2021-07-28 09:12:22 -07:00
dfsek cefa4369f2 register and/or locator templates 2021-07-28 09:04:10 -07:00
dfsek d6b36f4d3f OrLocatorTemplate 2021-07-28 09:03:08 -07:00
dfsek 12c068b252 AndLocatorTemplate 2021-07-28 09:02:37 -07:00
dfsek 26152ec94e add boolean methods to Locator 2021-07-28 08:58:10 -07:00
dfsek 19861ec27b binary column SurfaceLocator 2021-07-28 08:40:48 -07:00
dfsek fda44b8e99 RandomLocator binary column 2021-07-28 08:33:36 -07:00
dfsek 1624c999ac PatternLocator binarycolumn 2021-07-28 08:19:03 -07:00
dfsek d43eccc442 column min/max y 2021-07-28 08:16:59 -07:00
dfsek 7a44b74b61 use binarycolumn in locator 2021-07-28 08:12:38 -07:00
dfsek 220a981b05 implement BinaryColumn 2021-07-28 08:08:03 -07:00
dfsek 987de074c6 refactor MatchPattern 2021-07-28 07:28:17 -07:00
dfsek e356291bba expressions -> functions 2021-07-28 07:27:51 -07:00
dfsek 12d78e0b73 equation -> expression 2021-07-28 07:27:31 -07:00
dfsek bc199d9b06 Merge pull request #253 from PolyhedralDev/dev/addon-splits
Boolean distributors, pattern matching locator
2021-07-27 20:50:08 -07:00
dfsek 926e5a8ca9 remove github workflow 2021-07-27 20:48:25 -07:00
dfsek 4ad638983a fix pattern Y level 2021-07-27 20:39:17 -07:00
dfsek 90e127a512 MetaNumberPreprocessor after MetaValuePreprocessor 2021-07-27 20:25:37 -07:00
dfsek 9d12fe1bf1 singleton range shorthand 2021-07-27 20:23:00 -07:00
dfsek d09fe9b2a4 register number preprocessor 2021-07-27 20:17:02 -07:00
dfsek f00766ea93 register map preprocessor 2021-07-27 20:16:08 -07:00
dfsek 122e72e842 register string preprocessor first 2021-07-27 20:15:15 -07:00
dfsek b3f15b77ee register value preprocessor last 2021-07-27 20:14:44 -07:00
dfsek ec19c468a2 meta annotate distributors 2021-07-27 20:13:35 -07:00
dfsek 782a43ca53 meta annotate pattern templates 2021-07-27 20:13:00 -07:00
dfsek 8ec438ab15 register pattern locator 2021-07-27 20:11:34 -07:00
dfsek 002b311827 create PatternLocatorTemplate 2021-07-27 20:11:03 -07:00
dfsek 36e6d1270d create PatternLocator 2021-07-27 20:09:32 -07:00
dfsek 07c8bfb29e register patterns 2021-07-27 20:07:35 -07:00
dfsek 63667f256b implement BlockSetMatchPatternTemplate 2021-07-27 20:06:33 -07:00
dfsek abfd050acb create SingleBlockMatchPatternTemplate 2021-07-27 20:05:06 -07:00
dfsek db93c9e2e9 create NotPatternTemplate 2021-07-27 20:02:42 -07:00
dfsek 1739c51ce6 create OrPatternTemplate 2021-07-27 20:01:55 -07:00
dfsek 9693fa641b Pattern#not 2021-07-27 20:01:29 -07:00
dfsek 167ab3146e create AndPatternTemplate 2021-07-27 20:00:46 -07:00
dfsek 5321662847 simplify AirMatchPatternTemplate 2021-07-27 19:58:08 -07:00
dfsek 347e0d2bd1 create SolidMatchPatternTemplate 2021-07-27 19:57:46 -07:00
dfsek ca02187b0c create AirMatchPatternTemplate 2021-07-27 19:56:11 -07:00
dfsek 649273db01 create MatchPattern 2021-07-27 19:50:26 -07:00
dfsek fb3f90a9cd Pattern boolean operations 2021-07-27 19:39:53 -07:00
dfsek 7430116fa9 create Pattern interface 2021-07-27 19:39:02 -07:00
dfsek c8bb780312 update noise IDs 2021-07-26 23:19:57 -07:00
dfsek b25be7ae98 register OR distributor 2021-07-26 21:40:06 -07:00
dfsek 4567011313 create OrDistributorTemplate 2021-07-26 21:39:43 -07:00
dfsek a24de0ab97 register AND distributor 2021-07-26 21:38:19 -07:00
dfsek f76ef93fe6 create AndDistributorTemplate 2021-07-26 21:37:52 -07:00
dfsek c64266febb Merge pull request #252 from PolyhedralDev/dev/addon-splits
Make TerraPlugin implementations less boilerplate-y
2021-07-26 21:34:06 -07:00
dfsek 6da8c72593 remove TerraPlugin#saveDefaultConfig 2021-07-25 22:43:36 -07:00
dfsek c13494ca03 implement AbstractTerraPlugin#load 2021-07-25 22:42:53 -07:00
dfsek 19d4673afe fix logger issue 2021-07-25 22:33:18 -07:00
dfsek 7f09ee4af3 cleanup AbstractTerraPlugin 2021-07-24 20:50:01 -07:00
dfsek f73366fcb3 Lazy#of -> Lazy#lazy 2021-07-24 20:14:19 -07:00
dfsek 074528003b clean up addon registry initialization 2021-07-24 20:11:04 -07:00
dfsek 22aa03cd51 update FabricAddon ID 2021-07-24 20:06:39 -07:00
dfsek cb876d12f9 use FabricAddon in TerraPluginImpl 2021-07-24 20:06:14 -07:00
dfsek 41d3e2f6b0 delete TerraFabricPlugin 2021-07-24 20:05:10 -07:00
dfsek 5cafd4999a use FabricEntryPoint as entry point 2021-07-24 20:04:25 -07:00
dfsek 4ec1ab7c16 remove references to TerraFabricPlugin 2021-07-24 20:03:52 -07:00
dfsek b19b85fd60 move FabricAddon to upper level 2021-07-24 20:02:30 -07:00
dfsek 68f82fef02 use TerraPluginImpl over TerraFabricPlugin 2021-07-24 19:56:54 -07:00
dfsek af4af84a48 register Fabric-specific loaders in TerraPluginImpl 2021-07-24 19:51:26 -07:00
dfsek e882be2ba4 create FabricEntryPoint 2021-07-24 19:49:59 -07:00
dfsek 34868680c1 Fabric TerraPluginImpl 2021-07-24 19:47:40 -07:00
dfsek 5bd70da0bc add getLanguage to AbstractTerraPlugin 2021-07-24 19:43:50 -07:00
dfsek e8ee7bc64f create AbstractTerraPlugin 2021-07-24 19:42:03 -07:00
dfsek 7f3a7645bd BasePluginConvention -> BasePluginExtension 2021-07-23 18:08:42 -07:00
dfsek 2790373071 JavaPluginConvention -> JavaPluginExtension 2021-07-23 18:02:10 -07:00
dfsek 8751346693 fix gradle property enabled deprecation warning 2021-07-23 16:06:34 -07:00
dfsek f987ffa6d0 Merge pull request #251 from PolyhedralDev/dev/refactors-6.0
Grable
2021-07-23 15:05:08 -07:00
dfsek d83e6f09a7 bump gradle version from 7.0.2 -> 7.1.1 2021-07-23 15:04:15 -07:00
dfsek 7b70478a7f remove configureCommon function 2021-07-23 15:01:48 -07:00
dfsek 363b70c1a6 correct afterEvaluate nesting 2021-07-23 14:54:51 -07:00
dfsek a3a4cf8251 remove configureCommon call from platform impls 2021-07-23 14:51:19 -07:00
dfsek 47c284656b automatically configureDistribution of platform impls 2021-07-23 14:50:47 -07:00
dfsek 1ae9ae71de remove configureAddon 2021-07-23 11:51:41 -07:00
dfsek 3b5e6b80d5 remove calls to configureAddon 2021-07-23 11:51:07 -07:00
dfsek fb26b02ad1 apply common configurations automatically 2021-07-23 11:47:54 -07:00
dfsek 67d3af71bf move Tectonic YAML dependency to implementation 2021-07-23 11:42:29 -07:00
dfsek 672349f5b7 run configurePublishing in API 2021-07-23 11:36:06 -07:00
dfsek aecb7201b8 remove redundant group declarations 2021-07-23 11:31:35 -07:00
dfsek cdd7abc596 remove redundant plugin dependencies 2021-07-23 11:27:35 -07:00
dfsek 4c7179cfa2 apply java plugin in CompilationConfig 2021-07-23 11:22:58 -07:00
dfsek fb6f591f0b apply java-library plugin in CompilationConfig 2021-07-23 11:22:29 -07:00
dfsek 6cd60d3f4f remove redundant publishing configs 2021-07-23 11:20:27 -07:00
dfsek 507ea8bc88 run configurePublishing from CommonConfig 2021-07-23 11:16:15 -07:00
dfsek bbcd571156 create PublishingConfig and configurePublishing function 2021-07-23 11:15:21 -07:00
dfsek 321c50c417 use configureAddon in addons 2021-07-23 11:10:03 -07:00
dfsek fe18d89580 create configureAddon method 2021-07-23 11:03:39 -07:00
dfsek a15e45875e automatically depend on API in addons 2021-07-23 10:59:24 -07:00
dfsek bcc6e314eb fix afterEvaluate issue 2021-07-23 10:58:02 -07:00
dfsek 789d5d1e23 automatically declare addon dependencies 2021-07-23 10:53:59 -07:00
dfsek 9d540d471d remove redundant Guava dependency declarations 2021-07-23 10:52:15 -07:00
dfsek e16208bd76 depend on guava in DependencyConfig 2021-07-23 10:47:37 -07:00
dfsek 579195481b compileOnly API in addons 2021-07-23 10:40:48 -07:00
dfsek f297636c61 feature API README 2021-07-23 10:34:46 -07:00
dfsek 2fdada2121 create api-features module 2021-07-23 10:33:04 -07:00
dfsek 1613ea843d Merge pull request #249 from PolyhedralDev/dev/refactors-6.0
Several refactors
2021-07-22 20:29:54 -07:00
dfsek 169ed64568 Structure#generateDirect -> #generate 2021-07-22 18:44:51 -07:00
dfsek 9d687208c9 remove useless Structure#generate implementation 2021-07-22 18:44:23 -07:00
dfsek 6d0a32f251 remove redundant suppression in Structure 2021-07-22 18:43:01 -07:00
dfsek 7d70b8fcdf remove test method from Structure 2021-07-22 18:42:37 -07:00
dfsek 89b03aa3fb implement StringIdentifiable 2021-07-22 18:40:48 -07:00
dfsek 696ee07c33 create StringIdentifiable 2021-07-22 18:37:59 -07:00
dfsek 55030450b5 remove world parameter from TerraBiome#getGenerator 2021-07-22 18:36:30 -07:00
dfsek be9e817c88 Generator -> GenerationSettings 2021-07-22 18:35:10 -07:00
dfsek 2f9387fbf0 refactor BiomeSource to pipeline addon 2021-07-22 18:33:50 -07:00
dfsek 4da5ce748d TerraChunkGenerator -> ChunkGenerator 2021-07-22 18:30:44 -07:00
dfsek f659c32749 delete ChunkGenerator 2021-07-22 18:30:09 -07:00
dfsek cdcbd28aa0 remove sponge buildscript 2021-07-22 18:29:16 -07:00
dfsek 8ae457b251 remove region buildscript 2021-07-22 18:28:50 -07:00
dfsek 9bf7b373b1 delete GenWrapper 2021-07-22 18:27:30 -07:00
dfsek b3f92410e0 delete BukkitChunkGenerator 2021-07-22 18:26:29 -07:00
dfsek 6ea11de2fd cleanup 2021-07-22 18:25:53 -07:00
dfsek ad9cc1afcb World#getTerraGenerator -> World#getGenerator 2021-07-22 14:28:37 -07:00
dfsek ec14666c6d remove World#getGenerator 2021-07-22 14:28:11 -07:00
dfsek 2517b74951 remove isTerraWorld from Fabric mixins 2021-07-22 14:25:06 -07:00
dfsek fe68aa6279 remove World#isTerraWorld 2021-07-22 14:21:14 -07:00
dfsek a753351137 Move BukkitChunkData out of BukkitChunkGenerator 2021-07-22 14:19:04 -07:00
dfsek 2e2f9d854d delete ChunkGeneratorMixin 2021-07-22 14:18:07 -07:00
dfsek 76b6c0a984 TerraGenerationStage -> GenerationStage 2021-07-22 14:17:12 -07:00
dfsek 1f9a51fc40 delete GenerationStage 2021-07-22 14:16:42 -07:00
dfsek 1039bf6001 delete TerraWorld 2021-07-22 14:15:06 -07:00
dfsek 109b5e38cd remove most terraworld dependency 2021-07-22 14:13:37 -07:00
dfsek ea60b30321 remove TerraWorld#getConfig 2021-07-22 14:00:16 -07:00
dfsek 8898bbd5c4 remove usages of TerraWorld#getConfig 2021-07-22 13:59:39 -07:00
dfsek a56d1818c8 implement World#getConfig 2021-07-22 13:51:51 -07:00
dfsek 7f050b37a4 remove TerraWorld#getBiomeProvider 2021-07-22 13:33:19 -07:00
dfsek 2948f25b50 remove uses of TerraWorld#getBiomeProvider 2021-07-22 13:32:34 -07:00
dfsek a91a5019f8 implement getBiomeProvider in World 2021-07-22 13:28:14 -07:00
dfsek 82169f0921 ConfigType#getTypeClass -> getTypeKey 2021-07-22 13:04:33 -07:00
dfsek 9359ba0c97 Merge pull request #247 from PolyhedralDev/dev/functionalevents
Abstract event system with functional default implementation
2021-07-22 10:11:53 -07:00
dfsek ba53923e8c use FailThrough when available 2021-07-21 22:20:20 -07:00
dfsek deb1063592 properly compute priorities 2021-07-21 22:17:04 -07:00
dfsek 2ea16f68a2 throw exception on non-failthrough events registered as failthrough 2021-07-21 22:12:16 -07:00
dfsek 2175ea849f only failthrough on FailThroughEvent 2021-07-21 22:09:05 -07:00
dfsek b630ab6531 remove event annotations 2021-07-21 22:06:20 -07:00
dfsek 8eddffb0a6 delete EventListener 2021-07-21 22:05:14 -07:00
dfsek 953318d9c0 implement FunctionalEventHandler 2021-07-21 22:04:40 -07:00
dfsek 6f1938ef82 functional events in FabricAddon 2021-07-21 20:23:45 -07:00
dfsek 1d6d63b399 functional events in TerraScriptAddon 2021-07-21 20:20:32 -07:00
dfsek d8a5951f6e functional events in FloraGenerationAddon 2021-07-21 20:19:12 -07:00
dfsek 185df6e8a4 functional events in YamlAddon 2021-07-21 20:17:54 -07:00
dfsek 315da531b7 delete TerraListener 2021-07-21 20:16:42 -07:00
dfsek ec26e7b1b0 functional events in FeatureGenerationAddon 2021-07-21 20:15:40 -07:00
dfsek 7363a305af functional events in StructureAddon 2021-07-21 20:13:59 -07:00
dfsek bff0106e65 functional events in PaletteAddon 2021-07-21 20:12:53 -07:00
dfsek 089eac9dc5 functional events in OreAddon 2021-07-21 20:12:02 -07:00
dfsek a0a15802e4 functional events in NoiseAddon 2021-07-21 20:10:57 -07:00
dfsek dce3742fcb LocatorAddon functional events 2021-07-21 20:09:43 -07:00
dfsek 502d2b5814 functional events in FloraAddon 2021-07-21 20:08:23 -07:00
dfsek 36ce88af0a functional events in FeatureAddon 2021-07-21 20:07:30 -07:00
dfsek 3f42b9ab3e functional events in DistributorAddon 2021-07-21 20:06:28 -07:00
dfsek facd878788 functional events in BiomeAddon 2021-07-21 20:04:53 -07:00
dfsek 9713a7a7ba implement functional events in NoiseChunkGenerator3DAddon 2021-07-21 20:03:52 -07:00
dfsek a030fb93f3 use functional events in BiomePipelineAddon 2021-07-21 20:00:50 -07:00
dfsek 67c45b7be3 functional event API 2021-07-21 19:58:42 -07:00
dfsek af1520eb83 fix gradle dependency stuff 2021-07-21 16:18:06 -07:00
dfsek 7932a97985 Merge pull request #246 from PolyhedralDev/dev/no-block-constant
Dont require constant in TerraScript block function
2021-07-21 15:20:45 -07:00
dfsek 5c92316725 implement BlockFunction Constant override 2021-07-21 15:18:42 -07:00
dfsek a28f46eca3 allow dynamic block data in TerraScript block function by default 2021-07-21 15:06:56 -07:00
dfsek 36838d8938 Merge pull request #245 from PolyhedralDev/dev/metaconfiguration
Metaconfiguration
2021-07-21 14:55:53 -07:00
dfsek 662196c7a6 MetaNumberPreprocessor fixes 2021-07-21 14:52:59 -07:00
dfsek d8bbc95c1e implement MetaNumberPreprocessor 2021-07-21 14:38:55 -07:00
dfsek 57658d2268 create test for metastring 2021-07-21 14:31:21 -07:00
dfsek 73fd1c9edd register StringPreprocessor 2021-07-21 14:25:16 -07:00
dfsek d054be5f25 implement MetaStringPreprocessor 2021-07-21 14:24:26 -07:00
dfsek 5a85099357 metaset impl 2021-07-21 10:02:10 -07:00
dfsek f7a5066008 typo 2021-07-21 09:59:21 -07:00
dfsek 5a8f5aa29c create test for MetaMap 2021-07-21 09:58:08 -07:00
dfsek d0434ef05e create MetaMapPreprocessor 2021-07-21 09:57:57 -07:00
dfsek 5c3cd73c03 add TypeKey#getAnnotatedType 2021-07-21 09:48:21 -07:00
dfsek 6f03cfa600 correctly remove placeholder in MetaListPreprocessor 2021-07-20 22:24:29 -07:00
dfsek 4c4df28adb create and implement MetaListPreprocessor 2021-07-20 22:15:06 -07:00
dfsek de4376dd9c Create MetaPreprocessor abstract class 2021-07-20 22:11:29 -07:00
dfsek f27e732b39 add metalist test 2021-07-20 21:58:43 -07:00
dfsek 90e60ca6aa MetaList processing 2021-07-20 21:52:37 -07:00
dfsek 2373174132 @Meta all the things 2021-07-20 21:29:30 -07:00
dfsek 6158cda740 debug-log discovered configs 2021-07-20 21:08:23 -07:00
dfsek 6285b7646b dont exclude pack.yml 2021-07-20 21:05:55 -07:00
dfsek 299bf0dae8 Only sort configs with type key 2021-07-20 21:05:01 -07:00
dfsek fe60e12f16 create MetaValuePreprocessor 2021-07-20 21:01:37 -07:00
dfsek c71445d3e5 create Meta annotation 2021-07-20 20:22:01 -07:00
dfsek feea26dea7 fix typo 2021-07-20 20:13:21 -07:00
dfsek 12540f3a2c Merge pull request #244 from PolyhedralDev/dev/features
Dev/features
2021-07-20 20:11:45 -07:00
dfsek a6324ae6e2 dont inject trees on Fabric 2021-07-20 20:07:17 -07:00
dfsek e63d675549 delete tree config addon 2021-07-20 20:04:00 -07:00
dfsek 1349d5b00e delete tree generation stage addon 2021-07-20 20:03:30 -07:00
dfsek 6be4c0b7c6 create and register PointSetDistributor 2021-07-20 19:57:31 -07:00
dfsek 7b9a473275 create and register RandomLocatorTemplate 2021-07-20 19:48:00 -07:00
dfsek 137206884c create RandomLocator 2021-07-20 19:44:12 -07:00
dfsek 5ea08eb898 Merge pull request #243 from PolyhedralDev/dev/features
Feature config
2021-07-20 19:34:24 -07:00
dfsek d6e2acce38 make salt long 2021-07-20 17:34:33 -07:00
dfsek 7b1853823c remove unneeded NoiseSamplerBuilderLoader 2021-07-20 16:08:58 -07:00
dfsek c8bb9bbfeb automatically register loader for Supplier<ObjectTemplate<T>> 2021-07-20 16:05:54 -07:00
dfsek 3a7edcb1e4 feature configuration 2021-07-20 15:18:03 -07:00
dfsek 0ff6a9cce1 dont use pack instance where unneeded 2021-07-20 15:12:06 -07:00
dfsek d807abb165 pass pack to ConfigType#registrySupplier 2021-07-20 15:09:51 -07:00
dfsek c1dfcafa1d create base FeatureAddon 2021-07-20 15:06:23 -07:00
dfsek 7a554a1fdb create feature config addon module 2021-07-20 15:00:46 -07:00
dfsek 7fef7125fe Merge pull request #240 from PolyhedralDev/dev/features
Distributor/Locator addons + basic implementations, remove seed context
2021-07-19 23:21:00 -07:00
dfsek 4c25a8f909 RandomSource -> NoiseSource 2021-07-19 22:23:32 -07:00
dfsek a8d4354851 StandardBiomeProvider -> BiomePipelineProvider 2021-07-19 22:23:03 -07:00
dfsek f9a199f177 BiomePipelineImpl -> BiomePipeline 2021-07-19 22:22:24 -07:00
dfsek 04d78c1e32 fix config loading issues 2021-07-19 22:21:49 -07:00
dfsek 4dc04131f4 BiomeProviderBuilderLoader -> BiomeProviderLoader 2021-07-19 22:03:41 -07:00
dfsek e7af30350b StageBuilderLoader -> StageLoader 2021-07-19 22:03:12 -07:00
dfsek 165642806c register cellular enum loaders 2021-07-19 21:57:53 -07:00
dfsek 9673ab8ce1 cleanup 2021-07-19 21:51:38 -07:00
dfsek 24a4ff4044 delete SeededBuilder 2021-07-19 21:47:21 -07:00
dfsek d997fc69bf delete StageSeeded 2021-07-19 21:43:47 -07:00
dfsek 03e4636ef9 remove SeededTerraBiome 2021-07-19 21:35:53 -07:00
dfsek 458fc422de directly instantiate biomes 2021-07-19 21:29:41 -07:00
dfsek 04bdd0b4a3 BiomeConfigAddon -> BiomeAddon 2021-07-19 21:26:52 -07:00
dfsek 785323f3f6 register DimensionApplicableNoiseSampler loader 2021-07-19 21:23:37 -07:00
dfsek d036ed289c delete SeededNoiseSampler 2021-07-19 21:21:56 -07:00
dfsek 96b52f9a3e remove unused class ExpressionSampler 2021-07-19 21:20:59 -07:00
dfsek f0441cbefc dont implement seedednoisesampler in noise addon 2021-07-19 21:19:57 -07:00
dfsek 6f40e7b1f5 remove SeededNoiseSampler from configs 2021-07-19 21:10:49 -07:00
dfsek 3bf8fe7901 pass seed to noise functions 2021-07-19 19:24:54 -07:00
dfsek 7acfc5e3d0 register SurfaceLocator 2021-07-18 15:52:39 -07:00
dfsek 913e7fd6df configure SurfaceLocator 2021-07-18 15:51:59 -07:00
dfsek a70641e01b create SurfaceLocator 2021-07-18 15:50:16 -07:00
dfsek ac99d89e96 register locator registry 2021-07-18 15:43:09 -07:00
dfsek fc63798103 create LocatorAddon 2021-07-18 15:41:08 -07:00
dfsek 1a3a7df3f7 create noise distributor 2021-07-18 15:38:40 -07:00
dfsek 46f64b5434 refactor ReflectionUtil to util.reflection package 2021-07-18 14:11:08 -07:00
dfsek 4447005b43 refactor TypeToken to TypeKey 2021-07-18 14:10:34 -07:00
dfsek 15f749bfe9 generify SeededBiomeSource 2021-07-18 14:08:59 -07:00
dfsek 11f161d546 remove DistributorProvider 2021-07-18 14:05:52 -07:00
dfsek 04e998748d remove LocatorProvider 2021-07-18 14:05:36 -07:00
dfsek 40cd6607b2 generify biome provider 2021-07-18 14:05:04 -07:00
dfsek 4b4c26eb84 generify noise registry 2021-07-18 13:59:26 -07:00
dfsek d5601229ac use TypeToken for registries 2021-07-18 13:55:35 -07:00
dfsek ebc81b196a typetoken getOrCreateRegistry 2021-07-18 13:37:40 -07:00
dfsek d10e2050cb default impl of getCheckedRegistry 2021-07-18 13:32:10 -07:00
dfsek cd208cbd18 use typetokens in RegistryHolder 2021-07-18 13:31:17 -07:00
dfsek d4e678fd65 bump Tectonic version 2021-07-18 13:21:38 -07:00
dfsek 03b96816c9 create TypeToken 2021-07-18 13:17:44 -07:00
dfsek d3a080127a remove ExceptionalConsumer 2021-07-18 10:00:48 -07:00
dfsek 3fecbe5d1d LocatorProvider API 2021-07-18 09:56:06 -07:00
dfsek 4a893cf081 DistributorProvider api 2021-07-18 09:55:37 -07:00
dfsek a2dac6dfca fix/suppress warnings 2021-07-17 21:59:48 -07:00
dfsek bc96006c4b remove unneeded semicolon 2021-07-17 21:56:35 -07:00
dfsek d4112e46c7 BiomeProviderBuilder -> SeededBiomeProvider 2021-07-17 21:51:18 -07:00
dfsek ec28f613d3 make SeededBuilder use unboxed long 2021-07-17 21:50:12 -07:00
dfsek 3a94c5287c BiomeBuilder -> SeededTerraBiome 2021-07-17 21:37:57 -07:00
dfsek 689fe0bc70 SourceSeeded -> SeededBiomeSource 2021-07-17 21:37:12 -07:00
dfsek 84e7d11156 NoiseSeeded -> SeededNoiseSampler 2021-07-17 21:36:27 -07:00
dfsek 1194cca485 refactor to distibguish providers from builders 2021-07-17 21:35:10 -07:00
dfsek ced5a05370 create base DistributorAddon 2021-07-17 21:33:52 -07:00
dfsek 6cff6db152 remove redundant catch block 2021-07-17 21:30:06 -07:00
dfsek be55f4a62d create distributors addon module 2021-07-17 21:28:10 -07:00
dfsek f57c5f39b9 create locators addon module 2021-07-17 21:27:38 -07:00
dfsek 180aae6e34 implement FeatureGenerationStage 2021-07-17 20:04:27 -07:00
dfsek 0f638b0317 feature configuration 2021-07-17 19:57:50 -07:00
dfsek 6b191ac00b initial FeatureGenerationAddon impl 2021-07-17 19:50:23 -07:00
dfsek b52dcf2f15 add world context to Feature 2021-07-17 19:37:14 -07:00
dfsek 62cf861c22 Locator API 2021-07-17 19:36:37 -07:00
dfsek fec5b138d2 create Column 2021-07-17 19:35:51 -07:00
dfsek f4f595425a Distributor api 2021-07-17 19:34:19 -07:00
dfsek fc2ce229ed basic Feature API 2021-07-17 19:30:07 -07:00
dfsek 3c4c8c62b2 Merge pull request #236 from PolyhedralDev/dev/addonification
Addonification
2021-07-17 18:07:36 -07:00
dfsek deedfb1f8d delete JarUtil 2021-07-17 18:00:37 -07:00
dfsek 3261e7451f dont load lang files in LangUtil 2021-07-17 17:59:41 -07:00
dfsek 98a0c9e052 include lang files in resource manifest 2021-07-17 17:59:16 -07:00
dfsek 453e1ebb87 dump resources from resource manifest 2021-07-17 17:53:25 -07:00
dfsek c65ea812ed create Gradle task to generate resource manifest 2021-07-17 16:57:49 -07:00
dfsek c26418b5ba depend on SnakeYAML in buildSrc 2021-07-17 16:32:43 -07:00
dfsek b626b74624 dont minify 2021-07-17 14:48:26 -07:00
dfsek ff329b2d18 structure generation stage addon 2021-07-17 14:34:02 -07:00
dfsek 6f5cca5e4e ore generation stage addon 2021-07-17 14:33:21 -07:00
dfsek 1e5a0bb93f split tree addon 2021-07-17 13:41:25 -07:00
dfsek 78735ec769 create TreeGenerationAddon 2021-07-17 13:28:50 -07:00
dfsek 887b17a421 refactor FloraPopulator to FloraGenerationStage 2021-07-17 13:26:13 -07:00
dfsek d43f226f2d create tree generation stage addon 2021-07-17 13:25:24 -07:00
dfsek 53b5ee2ca9 split flora addon into separate config and generation addons 2021-07-17 13:25:00 -07:00
dfsek 3ec536dc03 create FloraGenerationAddon template 2021-07-17 13:16:32 -07:00
dfsek 2f5751cda7 create flora generation stage submodule 2021-07-17 13:14:14 -07:00
dfsek f0e3b1aa1d structure addon work 2021-07-17 13:12:04 -07:00
dfsek 72f0b07a38 programmatically include subprojects 2021-07-17 12:41:26 -07:00
dfsek 810340dbfb property-ify trees 2021-07-17 12:25:08 -07:00
dfsek f4820e5a06 remove PlaceableLayer.java 2021-07-17 12:08:18 -07:00
dfsek 55733b0e28 lowercase artifact ID 2021-07-17 12:06:48 -07:00
dfsek 5bae639923 property-ify flora 2021-07-17 12:02:58 -07:00
dfsek a673f961b3 property-ify Chunk Generator addon 2021-07-17 10:34:14 -07:00
dfsek a66641cb8a create Linked annotation and link TerraBiome and BiomeBuilder 2021-07-17 10:28:05 -07:00
dfsek b1589ed046 implement PropertyHolder in TerraBiome 2021-07-17 10:23:40 -07:00
dfsek 60edef989c create simple property API 2021-07-17 10:22:21 -07:00
dfsek 646d8970aa remove palette definition from base biome config 2021-07-16 12:38:47 -07:00
dfsek 2e6b62d690 ocean and slant palettes 2021-07-16 12:07:10 -07:00
dfsek 0bd6ff9469 load palettes in chunk generator 2021-07-15 20:01:36 -07:00
dfsek 9e7bab340e slant palette loading 2021-07-15 18:09:06 -07:00
dfsek 2cd71cdcd3 slant palette things 2021-07-15 17:57:54 -07:00
dfsek 319df9e638 clean up biome template 2021-07-15 14:58:11 -07:00
dfsek 9d2ae0a828 fix fabric tree injection issue 2021-07-15 14:45:26 -07:00
dfsek d94ddb3e76 create config type loading events 2021-07-15 14:40:00 -07:00
dfsek cb4b537a2f document and refactor config events 2021-07-15 14:34:48 -07:00
dfsek 2705e7d6a2 dont implement LoaderHolder in TerraPlugin 2021-07-15 14:05:44 -07:00
dfsek b3594b2479 make DuplicateEntryException unchecked 2021-07-15 13:55:47 -07:00
dfsek 8cd2554d3a fix registry overwrite issue 2021-07-15 13:54:01 -07:00
dfsek 95e6479505 cleanup 2021-07-15 13:24:05 -07:00
dfsek 34e78ab55e implement tree populator 2021-07-14 14:49:58 -07:00
dfsek 089af42623 working flora populator impl 2021-07-14 10:27:14 -07:00
dfsek 7a38284158 implement flora populator 2021-07-14 07:30:22 -07:00
dfsek 7fa2e8251e create and implement ConfigLoadEvent 2021-07-14 07:15:16 -07:00
dfsek bac5557873 finish READMEs 2021-07-13 20:47:39 -07:00
dfsek 2745bb8ba3 chunk generator README 2021-07-13 20:44:14 -07:00
dfsek 26d91a715c biome addon READMEs 2021-07-13 20:42:42 -07:00
dfsek 19672b1083 update to tectonic 2.0.0 2021-07-13 20:37:53 -07:00
dfsek c21038a21e implement YAML addon 2021-07-13 15:47:19 -07:00
dfsek d2aa7cf5d5 create language-yaml addons 2021-07-13 15:28:29 -07:00
dfsek f12d23b4cb create ConfigurationLoadEvent 2021-07-13 15:25:46 -07:00
dfsek 0dfde174ad begin tectonic update process 2021-07-13 15:23:28 -07:00
dfsek 27d9716c5d update to Tectonic 2.0.0 2021-07-13 14:50:35 -07:00
dfsek 589158ee71 reformat 2021-07-13 14:24:33 -07:00
dfsek dea68d0ede apache rng dependency stuff 2021-07-13 12:45:49 -07:00
dfsek 61d03a7022 org.json dependency stuff 2021-07-13 12:39:23 -07:00
dfsek 3be90cab53 paralithic dependency stuff 2021-07-13 12:32:24 -07:00
dfsek cf88c51fda commons IO dependency changes 2021-07-13 12:30:04 -07:00
dfsek 6f7b7a2336 asm dependency changes 2021-07-13 11:25:08 -07:00
dfsek cfaa2f33ae jafama dependency changes 2021-07-13 11:22:50 -07:00
dfsek 9b6247dcb8 remove duplicate ioutils dependency 2021-07-13 11:05:44 -07:00
dfsek 113568da9b clean up snakeyaml dependency 2021-07-13 11:04:30 -07:00
dfsek 52295af5a7 clean up tectonic dependency 2021-07-13 10:59:53 -07:00
dfsek 43f77f1531 implement TreeLayer 2021-07-10 22:41:07 -07:00
dfsek 0ba02719c0 create FloraLayer 2021-07-10 22:37:59 -07:00
dfsek 9664e003c6 remove GlueList 2021-07-10 21:45:49 -07:00
dfsek 519956dc11 refactor implementation 2021-07-10 21:44:38 -07:00
dfsek d09ef5052a correct link to ShadowJar issue 2021-07-10 21:19:57 -07:00
dfsek 3f539b1e30 bundle addons in JAR 2021-07-10 21:17:21 -07:00
dfsek 3dc564c0f7 move compiled addons to run directories 2021-07-09 13:06:29 -07:00
dfsek f61883547e add gradle stuff to automatically build addons 2021-07-09 08:21:30 -07:00
dfsek f8b0f03d11 compile structure addon 2021-07-09 06:58:46 -07:00
dfsek d0c9145aad compile carver addon 2021-07-09 06:44:07 -07:00
dfsek b36955a10a change addon IDs to reflect new module names 2021-07-08 23:29:28 -07:00
dfsek 40e28c5e4b move modules to better directory structure 2021-07-08 23:08:56 -07:00
dfsek b609a0ba63 add stages to ConfigPackTemplate 2021-07-08 22:39:29 -07:00
dfsek 8dcd50d3fb BlockPopulator -> GenerationStage 2021-07-08 10:12:44 -07:00
dfsek 719ea83bcd populator registration 2021-07-08 09:54:18 -07:00
dfsek 6ca9ba029b clean up biome and structure things 2021-07-08 06:18:16 -07:00
dfsek e1abc67989 clean up and annotate generic utils 2021-07-07 20:38:16 -07:00
dfsek 6a1cc16dc3 load addon dependencies before pack manifest 2021-07-07 13:15:09 -07:00
dfsek 1ac903cf91 get or create chunk generator registry 2021-07-07 11:25:59 -07:00
dfsek 2f55206cf0 registered chunk generators in impl 2021-07-07 11:22:47 -07:00
dfsek 43395fef08 refactor to NoiseChunkGenerator3D 2021-07-07 10:58:44 -07:00
dfsek 99d64fec36 build chunk generator addon 2021-07-07 10:54:25 -07:00
dfsek 66a5cce399 create ChunkGeneratorProvider 2021-07-07 10:31:01 -07:00
dfsek 88dfb299a5 create chunk generator addon module 2021-07-07 07:56:33 -07:00
dfsek 25073199f0 correct some errors in carver and structure addons 2021-07-06 22:23:04 -07:00
dfsek 5c4ef3f23b implement biome pipeline addon 2021-07-06 21:50:52 -07:00
dfsek 9c3b6ea8bd compile biome pipeline addon 2021-07-06 21:31:34 -07:00
dfsek 7ca0be40dd Merge remote-tracking branch 'origin/master' into dev/addonification 2021-07-06 14:32:54 -07:00
dfsek da26a1c54e bump minecraft version to 1.17.1 2021-07-06 14:29:58 -07:00
dfsek 01351883d1 use getOrCreateRegistry 2021-07-05 22:39:48 -07:00
dfsek 4acfeab948 getOrCreateRegistry 2021-07-05 21:56:14 -07:00
dfsek 04725698e8 use getCheckedRegistry where possible 2021-07-05 21:52:28 -07:00
dfsek 52a269b686 pull BiomeProviderBuilder out of BiomeProvider 2021-07-05 21:39:55 -07:00
dfsek 39f5aef0c5 noise addon + pack.yml noise functions 2021-07-05 20:35:39 -07:00
dfsek b8e1e99b84 noise addon impl 2021-07-05 20:09:59 -07:00
dfsek fe28fcedd1 fix addon registry stack overflow 2021-07-05 19:47:02 -07:00
dfsek 27a54101e7 make all util classes final 2021-07-05 19:31:26 -07:00
dfsek 7f1963a367 refactor ExceptionalConsumer 2021-07-05 19:24:02 -07:00
dfsek 6f8a7d6364 CheckedRegistry#addUnchecked -> #registerUnchecked 2021-07-05 19:22:45 -07:00
dfsek 9221a4f1ae CheckedRegistry#add -> #register 2021-07-05 19:22:21 -07:00
dfsek d4a784ddb5 Registry#addChecked -> #registerChecked 2021-07-05 19:21:21 -07:00
dfsek 888e9e8def Registry#add -> #register 2021-07-05 19:20:47 -07:00
dfsek a89b250765 refactor ProbabilityCollection and MaterialSet 2021-07-05 19:18:55 -07:00
dfsek e7a2758722 PaletteHolderLoader 2021-07-05 16:38:49 -07:00
dfsek d2298240ed fix probability collection loading 2021-07-05 15:25:05 -07:00
dfsek dea12d3056 apply palette loader 2021-07-05 13:10:49 -07:00
dfsek b4f464c428 terrascript addon impl 2021-07-05 02:23:18 -07:00
dfsek 7fcce19897 api to access Loader 2021-07-05 02:06:14 -07:00
dfsek 58a5160d53 api to access Loader 2021-07-05 02:05:26 -07:00
dfsek 9f37285c9a create TerraScriptAddon 2021-07-05 01:37:53 -07:00
dfsek 8213d23d72 compile terrascript 2021-07-05 01:36:24 -07:00
dfsek fb63e38862 refactor terrascript 2021-07-05 01:29:19 -07:00
dfsek d4d1a4434e terrascript module 2021-07-05 01:18:27 -07:00
dfsek d8eeeded60 fix MaterialSet issues 2021-07-05 01:14:34 -07:00
dfsek 1a50060ff0 flora addon impl 2021-07-05 01:00:52 -07:00
dfsek 0441837b19 compile palette addon 2021-07-05 00:55:01 -07:00
dfsek 7c30437031 flora addon impl 2021-07-05 00:47:51 -07:00
dfsek 3da777459e compile flora addon 2021-07-05 00:43:17 -07:00
dfsek 32b0cd0b26 tree addon impl 2021-07-05 00:35:35 -07:00
dfsek 1ad08a599d compile tree addon 2021-07-05 00:30:53 -07:00
dfsek 1777dc1aca ore addon impl 2021-07-05 00:18:51 -07:00
dfsek 3ea6724e6c build ore addon 2021-07-05 00:13:23 -07:00
dfsek 25339ca4ef working biome config addon 2021-07-05 00:02:48 -07:00
dfsek 3364a75cec build biome config addon 2021-07-04 23:11:08 -07:00
dfsek 19d482f249 cleanup and config registering 2021-07-04 21:51:18 -07:00
dfsek 2b2aa493b1 compile Fabric 2021-07-04 21:34:59 -07:00
dfsek 54f4722297 implementation compiles now 2021-07-04 19:59:46 -07:00
dfsek e9dc7d3db6 fix some refactor errors 2021-07-02 10:49:17 -07:00
dfsek 5c66dd4f17 refactor structures 2021-07-02 10:17:31 -07:00
dfsek 46c6113020 refactor trees 2021-07-02 10:05:26 -07:00
dfsek bff7e44984 refactor ores 2021-07-02 09:58:12 -07:00
dfsek 7834509390 more modules 2021-07-02 09:50:34 -07:00
dfsek 8ff022cbc8 palette refactors 2021-07-02 09:50:15 -07:00
dfsek 6755054c97 refactor flora stuff 2021-07-02 09:36:24 -07:00
dfsek 62520af8e7 move more things to new modules 2021-07-02 07:44:30 -07:00
dfsek 215a1e0e86 more addonification progress 2021-06-30 21:29:19 -07:00
dfsek 8a000137a2 more addon modules 2021-06-30 12:30:44 -07:00
dfsek f4873f7569 noise addon compiles now 2021-06-30 10:48:51 -07:00
dfsek 445bf3d053 refactor Vector2 2021-06-30 10:47:51 -07:00
dfsek bf5e8d903c put vector3 in class in API 2021-06-30 10:39:03 -07:00
dfsek abd3683a49 create noise addon module 2021-06-29 19:48:23 -07:00
dfsek 22c97ca390 refactor addon loader to new module 2021-06-29 19:34:54 -07:00
dfsek 9880f488e5 implementation depends on loaders (for now) 2021-06-29 19:23:31 -07:00
dfsek 7cd60d6d4e set up modules for addon/config loaders 2021-06-29 19:21:12 -07:00
dfsek ca3a9180be sort of working fabric impl 2021-06-29 19:10:13 -07:00
dfsek bce7a181bd property based block data implementation 2021-06-26 02:17:31 -07:00
dfsek 43307b737c refactor block state package 2021-06-25 20:51:38 -07:00
dfsek 4ecb08619f refactor block entity package 2021-06-25 20:30:55 -07:00
dfsek edb5e316ba more properties 2021-06-25 20:30:19 -07:00
dfsek a3cbf9a945 BlockData -> BlockState 2021-06-25 19:13:42 -07:00
dfsek 002c7037f1 basic property interfaces 2021-06-25 19:12:43 -07:00
dfsek 3386570439 BlockState -> BlockEntity 2021-06-25 19:12:23 -07:00
dfsek d880d95637 Location is gone. 2021-06-25 13:47:56 -07:00
dfsek 966e1eb2a6 imports 2021-06-25 13:33:43 -07:00
dfsek 56029851f0 begin removing Location 2021-06-25 13:27:56 -07:00
dfsek 4306b179bb fix Vector3Impl#equals 2021-06-25 07:57:17 -07:00
dfsek cbb746c752 fix bukkit impl 2021-06-25 06:30:29 -07:00
dfsek da0fb7dd15 fix world coordinate issues on Fabric 2021-06-25 00:45:24 -07:00
dfsek ff4cbda294 fix flora issue 2021-06-24 23:48:28 -07:00
dfsek 9fa660409d sort of working fabric implementation 2021-06-24 23:41:08 -07:00
dfsek dc1f1a0339 compile Fabric 2021-06-24 19:19:44 -07:00
dfsek ab9f98994d Merge remote-tracking branch 'origin/ver/6.0.0' into ver/6.0.0 2021-06-24 15:02:56 -07:00
dfsek 03ecf6197a implementation compilation 2021-06-24 14:53:57 -07:00
dfsek 0acff143fb Merge pull request #229 from ajgeiss0702/ver/6.0.0
Remove bukkit-style biome IDs
2021-06-24 13:48:06 -07:00
ajgeiss0702 c4de7e578a Remove bukkit-style biome IDs 2021-06-24 13:27:10 -07:00
dfsek 18d071128d remove Block from API 2021-06-24 08:25:50 -07:00
dfsek 255e4396dd refactor registries 2021-06-24 08:16:15 -07:00
dfsek c26f4dfc2f remove redundant openregistry implementations 2021-06-24 06:59:59 -07:00
dfsek 9838a4ce0b Merge pull request #228 from Astrashh/astrash/bonk-hardcoded-flora
Remove hardcoded flora registry entries
2021-06-24 06:22:02 -07:00
Astrashh cf30f3d067 Remove hardcoded flora registry entries 2021-06-24 21:38:07 +10:00
dfsek 4bac67b8d7 fix imports 2021-06-24 00:19:18 -07:00
dfsek c0b55c3e4e undeprecate Location and Block, will deal with them in separate PRs 2021-06-24 00:05:06 -07:00
dfsek f69fdbe37e fix EntityMixin 2021-06-23 23:59:38 -07:00
dfsek 918ff28ed4 bukkit pass 2 2021-06-23 15:56:41 -07:00
dfsek 2906a4f891 fabric pass 2 2021-06-23 15:35:52 -07:00
dfsek d4d2b659dc fabric pass 1 2021-06-23 14:53:00 -07:00
dfsek 89657e362a implementation pass 1 2021-06-23 13:33:59 -07:00
dfsek 9631b1b578 begin work on impl 2021-06-23 13:18:16 -07:00
dfsek f380247613 API compiles now 2021-06-23 12:43:16 -07:00
dfsek 686680d731 location garbage 2021-06-23 12:03:17 -07:00
dfsek e34e2dd0b2 cleanup 2021-06-23 10:48:57 -07:00
dfsek 24b8fc859c more refactors, create platform module 2021-06-23 10:39:37 -07:00
dfsek 506f59f8af fix Range 2021-06-23 10:22:19 -07:00
dfsek fa0bd103f3 minor cleanup 2021-06-23 10:13:50 -07:00
dfsek a5f879ae7a ConfigPack interfaceification 2021-06-23 10:09:55 -07:00
dfsek bb888380aa more refactors 2021-06-23 10:05:29 -07:00
dfsek 7495a6b4a1 begin refactor 2021-06-23 09:42:17 -07:00
dfsek cf214cc274 split common 2021-06-22 23:56:34 -07:00
dfsek 10f633be9a resolve merge conflicts 2021-06-22 22:09:46 -07:00
dfsek 43aa3fc086 Merge remote-tracking branch 'origin/master' into ver/6.0.0
# Conflicts:
#	build.gradle.kts
#	common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolder.java
#	common/src/main/java/com/dfsek/terra/api/world/palette/holder/PaletteHolderBuilder.java
#	common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java
#	common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java
#	common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java
#	common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java
#	gradle.properties
#	platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java
#	platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java
#	platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java
2021-06-22 21:59:27 -07:00
dfsek efd1665c1d Merge pull request #222 from PolyhedralDev/dev/bukkit-1.17
bukkit version 1_17
2021-06-19 14:07:09 -07:00
dfsek 40e950732b bukkit version 1_17 2021-06-19 14:05:06 -07:00
dfsek b15ec9a215 Merge pull request #221 from PolyhedralDev/dev/bukkit-1.17
Bump Paper API version to 1.17, implement custom world height support on Bukkit.
2021-06-19 13:55:43 -07:00
dfsek 2316043c1e implement BukkitWorld#getMinHeight 2021-06-19 13:47:51 -07:00
dfsek ec20387aea update dependency versions 2021-06-19 13:39:43 -07:00
dfsek 85e4c0eca1 Merge pull request #217 from PolyhedralDev/dev/late-inject
Inject biomes later, fix getHeight issues (again)
2021-06-19 13:26:29 -07:00
dfsek fa01c47f43 fix re-registering issue 2021-06-19 13:25:20 -07:00
dfsek b85880fc92 server only mixins 2021-06-18 14:11:25 -07:00
dfsek d5dc37629e fabric lifecycle api 2021-06-18 14:08:27 -07:00
dfsek b3e2685564 init biomes on server 2021-06-18 12:18:08 -07:00
dfsek b948202ef2 cleanup FabricChunkGeneratorWrapper 2021-06-18 09:07:56 -07:00
dfsek 9ba544bf71 dont hold static biomes 2021-06-17 00:07:06 -07:00
dfsek 82dfe652e0 bump version 2021-06-15 02:03:42 -07:00
dfsek 392ad207d9 use getUngeneratedBlock in getColumnSample 2021-06-15 01:58:46 -07:00
dfsek 01e47b0bab fix getHeight crash 2021-06-15 01:56:23 -07:00
dfsek c7cbf11631 override ChunkGenerator#getEntitySpawnList 2021-06-15 01:42:53 -07:00
dfsek afdb4fbfa2 late init biomes 2021-06-15 01:37:28 -07:00
dfsek ef8a5b1453 Merge pull request #215 from PolyhedralDev/dev/multi-inheritance
Implement multi-inheritance in configs
2021-06-14 22:18:12 -07:00
dfsek 1f56673c77 add parent info to BiomeInfoCommand 2021-06-13 13:58:22 -07:00
dfsek 0ad0355250 bump version 2021-06-13 13:24:32 -07:00
dfsek 8d3b3c7024 remove extends value from biome config 2021-06-13 13:23:58 -07:00
dfsek b63ea99167 bump tectonic version 2021-06-13 12:41:52 -07:00
dfsek 444324e7c6 Merge pull request #200 from Astrashh/astrash/tesf-anywhere
Remove script sub-directory requirement
2021-05-22 15:20:16 -07:00
Astrashh 4908c7bb73 Remove script sub-directory requirement 2021-05-22 23:10:47 +10:00
dfsek 62b60fcdb3 Merge pull request #152 from Astrashh/dev/debug-enhancements
Debug enhancements (#149)
2021-05-18 17:59:53 -07:00
Astrashh 9b52277d9a Add debugBlock function 2021-05-11 15:48:40 +10:00
Astrashh 1209842bcd Implement ignorable functions to parser 2021-05-11 15:48:28 +10:00
Astrashh 596ac1c389 Remove isDebug from forge 2021-05-11 15:47:37 +10:00
Astrashh 9551a1e875 Merge pull request #1 from PolyhedralDev/ver/6.0.0
Ver/6.0.0
2021-05-11 10:59:44 +10:00
dfsek 77bb04e91f fix structure completer 2021-05-09 22:34:44 -07:00
dfsek 97aa9d9a91 resolve merge conflicts 2021-05-09 22:28:52 -07:00
dfsek 526049523f Merge remote-tracking branch 'origin/master' into ver/6.0.0
# Conflicts:
#	build.gradle.kts
#	common/src/main/java/com/dfsek/terra/api/TerraPlugin.java
#	common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java
#	common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java
#	common/src/main/java/com/dfsek/terra/profiler/Profiler.java
#	common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java
#	common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java
#	common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java
#	common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java
#	common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java
#	common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java
#	common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java
#	common/src/test/java/biome/DistributionTest.java
#	common/src/test/java/biome/ImageTest.java
#	platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java
#	platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java
#	platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java
2021-05-09 22:20:47 -07:00
Astrashh f7ea81cb51 Add new debug options to plugin config 2021-05-03 11:39:45 +10:00
dfsek 9ea8dc7eee Merge pull request #141 from Astrashh/dev/slant-list
Implement multiple slant thresholds (#91)
2021-04-29 00:51:56 -07:00
Astrashh df2c654192 Only calculate slope if slant is defined 2021-04-29 16:42:00 +10:00
Astrashh 5542dee7b7 Implement multiple slant thresholds 2021-04-29 10:03:04 +10:00
dfsek 5397df57b8 Merge pull request #125 from PolyhedralDev/dev/profiler
Implement fancy stack-based profiler
2021-04-12 09:30:26 -07:00
dfsek aa0de88821 @SuppressWarnings go brrr 2021-04-12 09:23:02 -07:00
dfsek bd3136ca92 fix stack size assumption at profiler start 2021-04-12 09:19:03 -07:00
dfsek 339413c0de profile more things 2021-04-12 08:46:56 -07:00
dfsek 31b55ca682 fancy unicode symbols B) 2021-04-12 01:16:26 -07:00
dfsek aaf0830d66 fix % parent issue 2021-04-12 00:46:00 -07:00
dfsek f78ee70609 implement terrascript profiling 2021-04-12 00:45:52 -07:00
dfsek 9c1a35f444 implement new profiler 2021-04-12 00:24:13 -07:00
dfsek f4716cb28f add autocloseable option 2021-04-12 00:07:22 -07:00
dfsek b3e3c28276 implement TerraPlugin#getProfier 2021-04-12 00:05:53 -07:00
dfsek 4eadbb7d83 improve performance in deep operations 2021-04-11 23:24:44 -07:00
dfsek 7b3b341627 improve data output 2021-04-11 23:08:32 -07:00
dfsek 89267ce8cb basic profiler implementation 2021-04-11 22:54:55 -07:00
dfsek 78e3575d9b Merge pull request #118 from PolyhedralDev/dev/directories
Remove hard-coded registries, allow addons to register custom config types, remove strict directory requirements
2021-04-11 21:26:36 -07:00
dfsek e671ef783f completely dynamic registries 2021-04-11 20:56:15 -07:00
dfsek 91144dc8f8 Merge remote-tracking branch 'origin/master' into dev/directories
# Conflicts:
#	build.gradle.kts
2021-04-11 18:57:33 -07:00
dfsek 4202875675 dynamic registris in WorldConfig 2021-04-11 03:15:44 -07:00
dfsek 4237657dad remove most hard coded registries 2021-04-11 02:39:21 -07:00
dfsek 75cb6be36f resolve merge issues 2021-04-11 00:53:21 -07:00
dfsek 88a7397bbe Merge branch 'ver/5.1.3' into dev/directories
# Conflicts:
#	common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java
#	common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java
2021-04-11 00:51:51 -07:00
dfsek a6a1810b4a bump version 2021-04-05 17:08:57 -07:00
dfsek da4aebe498 fix parser EOF NPE 2021-04-05 17:08:50 -07:00
dfsek 03ebafc7b6 working config loading 2021-04-05 12:26:54 -07:00
dfsek a78e64a9bb rename ore "type" to "algorithm" 2021-04-05 09:59:52 -07:00
dfsek 6374b0ab08 add ConfigPack#getConfigTypeRegistry 2021-04-05 09:52:47 -07:00
dfsek 473ed45dee add config type registry to ConfigPack loader registry 2021-04-05 09:50:07 -07:00
dfsek d96d834a08 redo ConfigType and loading 2021-04-05 09:48:11 -07:00
dfsek f756ebef44 fix unhandled exception 2021-04-05 01:36:39 -07:00
dfsek e6931a53d6 basic implementation 2021-04-05 01:31:22 -07:00
dfsek 58b5f3a5fe bump Tectonic version 2021-04-05 00:27:58 -07:00
1063 changed files with 14693 additions and 15783 deletions
+5 -5
View File
@@ -105,7 +105,7 @@ ij_java_for_statement_wrap = off
ij_java_generate_final_locals = false
ij_java_generate_final_parameters = false
ij_java_if_brace_force = never
ij_java_imports_layout = *,|,javax.**,java.**,|,$*
ij_java_imports_layout = *, |, javax.**, java.**, |, $*
ij_java_indent_case_from_switch = true
ij_java_insert_inner_class_imports = false
ij_java_insert_override_annotation = true
@@ -137,7 +137,7 @@ ij_java_method_parameters_wrap = off
ij_java_modifier_list_wrap = false
ij_java_names_count_to_use_import_on_demand = 3
ij_java_new_line_after_lparen_in_record_header = false
ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
ij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.*
ij_java_parameter_annotation_wrap = off
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
@@ -246,7 +246,7 @@ ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = false
ij_java_wrap_long_lines = false
[{*.gradle.kts,*.kt,*.kts,*.main.kts}]
[{*.gradle.kts, *.kt, *.kts, *.main.kts}]
ij_kotlin_align_in_columns_case_branch = false
ij_kotlin_align_multiline_binary_operation = false
ij_kotlin_align_multiline_extends_list = false
@@ -325,7 +325,7 @@ ij_kotlin_wrap_elvis_expressions = 1
ij_kotlin_wrap_expression_body_functions = 0
ij_kotlin_wrap_first_method_in_call_chain = false
[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,jest.config}]
[{*.har, *.jsb2, *.jsb3, *.json, .babelrc, .eslintrc, .stylelintrc, bowerrc, jest.config}]
indent_size = 2
ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false
@@ -338,7 +338,7 @@ ij_json_spaces_within_braces = false
ij_json_spaces_within_brackets = false
ij_json_wrap_long_lines = false
[{*.yaml,*.yml}]
[{*.yaml, *.yml}]
indent_size = 2
ij_yaml_keep_indents_on_empty_lines = true
ij_yaml_keep_line_breaks = true
+1
View File
@@ -8,4 +8,5 @@ assignees: ""
---
## Describe the issue
<!-- Please describe the issue as clearly and as concisely as possible, without missing any details. -->
+6 -6
View File
@@ -1,11 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: Which Issue Template do I Choose?
url: https://github.com/PolyhedralDev/Terra/wiki/How-To-Choose-An-Issue-Template
- name: Which Issue Template do I Choose?
url: https://github.com/PolyhedralDev/Terra/wiki/How-To-Choose-An-Issue-Template
about: Click this if you don't know which issue template to select. This will help you make sure you choose the right one and provide enough information for us to help you.
- name: Terra Wiki
url: https://github.com/PolyhedralDev/Terra/wiki
- name: Terra Wiki
url: https://github.com/PolyhedralDev/Terra/wiki
about: Documentation for all things Terra.
- name: Join the Support Discord
url: https://discord.dfsek.com
- name: Join the Support Discord
url: https://discord.dfsek.com
about: If you have a basic support question, join the Discord instead.
-40
View File
@@ -1,40 +0,0 @@
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
tags:
- "v*" # Push events to matching v*, i.e. v1.0, v20.15.10
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build Terra
run: gradle shadowJar
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: Package
path: build/libs
- name: Publish release
uses: marvinpinto/action-automatic-releases@latest
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
prerelease: false
files: |
build/libs/Terra-*.jar
LICENSE
+20 -13
View File
@@ -7,40 +7,47 @@ to your specifications, with no knowledge of Java required.
* Paper+ servers (Paper, Tuinity, Purpur, etc): [SpigotMC](https://www.spigotmc.org/resources/85151/)
* Fabric: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
* Forge **(ALPHA - NOT PRODUCTION-READY)**: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
* Forge **(ALPHA - NOT PRODUCTION-READY)**: [Modrinth](https://modrinth.com/mod/terra)
/ [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
## Building and Running Terra
To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This will build all platforms, and
produce JARs in `platforms/<platform>/build/libs`
To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This will build all platforms, and produce JARs
in `platforms/<platform>/build/libs`
### Production JARs:
* Bukkit: `Terra-<version>-shaded.jar`
* Fabric: `Terra-<version>-shaded-mapped.jar`
* Forge: `Terra-<version>-shaded.jar`
### Building a Specific Platform
To build a specific platform, run `gradlew :platforms:<platform>:build`.
JARs are produced in `platforms/<platform>/build/libs`.
### Running Minecraft in the IDE
To run Minecraft with Terra in the IDE (for testing) use the following tasks:
* Bukkit
* `installPaper` - Install a [Paper](https://github.com/PaperMC/Paper) test server. (Only needs to be run once).
* `installPurpur` - Install a [Purpur](https://github.com/pl3xgaming/Purpur) test server. (Only needs to be run once).
* `runPaper` - Run the Paper test server with Terra (`installPaper` must have been run previously).
* `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must have been run previously).
* `installPaper` - Install a [Paper](https://github.com/PaperMC/Paper) test server. (Only needs to be run once).
* `installPurpur` - Install a [Purpur](https://github.com/pl3xgaming/Purpur) test server. (Only needs to be run once).
* `runPaper` - Run the Paper test server with Terra (`installPaper` must have been run previously).
* `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must have been run previously).
* Fabric
* `runClient` - Run a Minecraft Fabric client with Terra installed.
* `runServer` - Run a Minecraft Fabric server with Terra installed.
* `runClient` - Run a Minecraft Fabric client with Terra installed.
* `runServer` - Run a Minecraft Fabric server with Terra installed.
* Forge
* `runClient` - Run a Minecraft Forge client with Terra installed.
* `runServer` - Run a Minecraft Forge server with Terra installed.
* `runClient` - Run a Minecraft Forge client with Terra installed.
* `runServer` - Run a Minecraft Forge server with Terra installed.
## Contributing
Contributions are welcome! If you want to see a feature in Terra, please, open an issue, or implement it yourself and
submit a PR!
Contributions are welcome! If you want to see a feature in Terra, please, open an issue, or implement it yourself and submit a PR!
Join the discord [here](https://discord.gg/PXUEbbF) if you would like to talk more about the project!
## Beta
Terra is still in beta! While it is stable, it is not feature-complete. There is a lot to be added!
+16 -5
View File
@@ -1,15 +1,20 @@
import com.dfsek.terra.getGitHash
import com.dfsek.terra.*
val versionObj = Version("5", "3", "3", true)
val versionObj = Version("6", "0", "0", true)
allprojects {
version = versionObj
group = "com.dfsek.terra"
configureDependencies()
configureCompilation()
configurePublishing()
tasks.withType<JavaCompile>().configureEach {
options.isFork = true
options.isIncremental = true
}
tasks.withType<Test>().configureEach {
useJUnitPlatform()
@@ -18,11 +23,17 @@ allprojects {
failFast = true
maxParallelForks = (Runtime.getRuntime().availableProcessors() - 1).takeIf { it > 0 } ?: 1
reports.html.isEnabled = false
reports.junitXml.isEnabled = false
reports.html.required.set(false)
reports.junitXml.required.set(false)
}
}
afterEvaluate {
project(":platforms").subprojects.forEach { // Platform projects are where distribution happens
it.configureDistribution()
}
}
/**
* Version class that does version stuff.
*/
+1
View File
@@ -10,4 +10,5 @@ repositories {
dependencies {
"implementation"("com.github.jengelman.gradle.plugins:shadow:+")
"implementation"("org.yaml:snakeyaml:1.27")
}
@@ -0,0 +1,41 @@
package com.dfsek.terra
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.jvm.tasks.Jar
import java.io.File
import java.util.function.Predicate
import kotlin.streams.asStream
/**
* Configures a directory where addons will be put.
*/
fun Project.addonDir(dir: File, task: Task) {
task.doFirst {
dir.parentFile.mkdirs()
matchingAddons(dir) {
it.name.startsWith("Terra-") // Assume everything that starts with Terra- is a core addon.
}.forEach {
println("Deleting old addon: " + it.absolutePath)
it.delete()
}
project(":common:addons").subprojects.forEach { addonProject ->
val jar = (addonProject.tasks.named("jar").get() as Jar)
val target = File(dir, jar.archiveFileName.get())
val base = "${jar.archiveBaseName.get()}-${project.version}"
println("Copying addon ${jar.archiveFileName.get()} to ${target.absolutePath}. Base name: $base")
jar.archiveFile.orNull?.asFile?.copyTo(target)
}
}
}
fun matchingAddons(dir: File, matcher: Predicate<File>): Set<File> {
val matching = HashSet<File>()
dir.walk().maxDepth(1).asStream().filter(matcher).forEach(matching::add)
return matching
}
@@ -1,19 +1,8 @@
package com.dfsek.terra
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.withType
import java.io.ByteArrayOutputStream
fun Project.configureCommon() {
configureDependencies()
configureCompilation()
configureDistribution()
version = rootProject.version
}
fun Project.getGitHash(): String {
val stdout = ByteArrayOutputStream()
exec {
@@ -2,7 +2,7 @@ package com.dfsek.terra
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.tasks.bundling.Jar
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.javadoc.Javadoc
@@ -11,9 +11,11 @@ import org.gradle.language.jvm.tasks.ProcessResources
fun Project.configureCompilation() {
apply(plugin = "maven-publish")
apply(plugin = "java")
apply(plugin = "java-library")
apply(plugin = "idea")
configure<JavaPluginConvention> {
configure<JavaPluginExtension> {
sourceCompatibility = JavaVersion.VERSION_16
targetCompatibility = JavaVersion.VERSION_16
}
@@ -1,10 +1,7 @@
package com.dfsek.terra
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.invoke
import org.gradle.kotlin.dsl.repositories
import org.gradle.kotlin.dsl.*
fun Project.configureDependencies() {
apply(plugin = "java")
@@ -26,13 +23,22 @@ fun Project.configureDependencies() {
maven { url = uri("https://papermc.io/repo/repository/maven-public/") }
maven { url = uri("https://maven.fabricmc.net/") }
gradlePluginPortal()
jcenter()
mavenCentral()
}
dependencies {
"testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0")
"testImplementation"("org.junit.jupiter:junit-jupiter-engine:5.7.0")
"api"("org.jetbrains:annotations:20.1.0")
"compileOnly"("org.jetbrains:annotations:20.1.0")
"compileOnly"("com.google.guava:guava:30.0-jre")
"testImplementation"("com.google.guava:guava:30.0-jre")
}
if (project(":common:addons").subprojects.contains(this)) { // If this is an addon project, depend on the API.
dependencies {
"compileOnly"(project(":common:api"))
"testImplementation"(project(":common:api"))
}
}
}
@@ -3,15 +3,23 @@ package com.dfsek.terra
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.tasks.bundling.Jar
import org.gradle.api.tasks.javadoc.Javadoc
import org.gradle.kotlin.dsl.*
import org.gradle.api.plugins.BasePluginExtension
import org.gradle.jvm.tasks.Jar
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.get
import org.gradle.kotlin.dsl.named
import org.yaml.snakeyaml.DumperOptions
import org.yaml.snakeyaml.Yaml
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.FileWriter
import java.net.URL
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
fun Project.configureDistribution() {
apply(plugin = "java-library")
apply(plugin = "com.github.johnrengelman.shadow")
val downloadDefaultPacks = tasks.create("downloadDefaultPacks") {
@@ -25,7 +33,85 @@ fun Project.configureDistribution() {
downloadPack(netherPackUrl, project)
}
}
tasks["processResources"].dependsOn(downloadDefaultPacks)
val installAddons = tasks.create("installAddons") {
group = "terra"
project(":common:addons").subprojects.forEach {
it.afterEvaluate {
dependsOn(it.tasks.getByName("build")) // Depend on addon JARs
}
}
doFirst {
// The addons are copied into a JAR because of a ShadowJar bug
// which expands *all* JARs, even resource ones, into the fat JAR.
// To get around this, we copy all addon JARs into a *new* JAR,
// then, ShadowJar expands the newly created JAR, putting the original
// JARs where they should go.
//
// https://github.com/johnrengelman/shadow/issues/111
val dest = File(buildDir, "/resources/main/addons.jar")
dest.parentFile.mkdirs()
val zip = ZipOutputStream(FileOutputStream(dest))
project(":common:addons").subprojects.forEach { addonProject ->
val jar = (addonProject.tasks.named("jar").get() as Jar)
println("Packaging addon ${jar.archiveFileName.get()} to ${dest.absolutePath}.")
val entry = ZipEntry("addons/${jar.archiveFileName.get()}")
zip.putNextEntry(entry)
FileInputStream(jar.archiveFile.get().asFile).copyTo(zip)
zip.closeEntry()
}
zip.close()
}
}
val generateResourceManifest = tasks.create("generateResourceManifest") {
group = "terra"
dependsOn(downloadDefaultPacks)
dependsOn(installAddons)
doFirst {
val resources = HashMap<String, MutableList<String>>()
val packsDir = File("${project.buildDir}/resources/main/packs/")
packsDir.walkTopDown().forEach {
if (it.isDirectory || !it.name.endsWith(".zip")) return@forEach
resources.computeIfAbsent("packs") { ArrayList() }.add(it.name)
}
val langDir = File("${project(":common:implementation").buildDir}/resources/main/lang/")
langDir.walkTopDown().forEach {
if (it.isDirectory || !it.name.endsWith(".yml")) return@forEach
resources.computeIfAbsent("lang") { ArrayList() }.add(it.name)
}
project(":common:addons").subprojects.forEach { addonProject ->
val jar = (addonProject.tasks.named("jar").get() as Jar).archiveFileName.get()
resources.computeIfAbsent("addons") { ArrayList() }.add(jar)
}
val options = DumperOptions()
options.indent = 2
options.indentWithIndicator = true
options.indicatorIndent = 2
options.isPrettyFlow = true
options.defaultFlowStyle = DumperOptions.FlowStyle.BLOCK
options.defaultScalarStyle = DumperOptions.ScalarStyle.DOUBLE_QUOTED
val yaml = Yaml(options)
val manifest = File("${project.buildDir}/resources/main/resources.yml")
if (manifest.exists()) manifest.delete()
manifest.createNewFile()
yaml.dump(resources, FileWriter(manifest))
}
}
tasks["processResources"].dependsOn(generateResourceManifest)
tasks.named<ShadowJar>("shadowJar") {
// Tell shadow to download the packs
@@ -36,17 +122,14 @@ fun Project.configureDistribution() {
archiveClassifier.set("shaded")
setVersion(project.version)
relocate("org.apache.commons", "com.dfsek.terra.lib.commons")
relocate("net.jafama", "com.dfsek.terra.lib.jafama")
relocate("org.objectweb.asm", "com.dfsek.terra.lib.asm")
relocate("com.google.errorprone", "com.dfsek.terra.lib.google.errorprone")
relocate("com.google.j2objc", "com.dfsek.terra.lib.google.j2objc")
relocate("org.checkerframework", "com.dfsek.terra.lib.checkerframework")
relocate("org.javax.annotation", "com.dfsek.terra.lib.javax.annotation")
relocate("org.json", "com.dfsek.terra.lib.json")
relocate("org.yaml", "com.dfsek.terra.lib.yaml")
minimize()
}
convention.getPlugin<BasePluginConvention>().archivesBaseName = project.name
configure<BasePluginExtension> {
archivesName.set(project.name)
}
tasks.named<DefaultTask>("build") {
dependsOn(tasks["shadowJar"])
@@ -0,0 +1,33 @@
package com.dfsek.terra
import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.kotlin.dsl.*
fun Project.configurePublishing() {
configure<PublishingExtension> {
publications {
create<MavenPublication>("mavenJava") {
artifact(tasks["sourcesJar"])
artifact(tasks["jar"])
}
}
repositories {
val mavenUrl = "https://repo.codemc.io/repository/maven-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) {
credentials {
username = mavenUsername
password = mavenPassword
}
}
}
}
}
}
+3
View File
@@ -0,0 +1,3 @@
# Core Addons
This directory contains the modularized "core addons" that implement Terra's default behavior.
+8
View File
@@ -0,0 +1,8 @@
# api-features
Contains the API for feature generation.
This API implemented in:
* `config-feature`
* `generation-stage-feature`
* `config-locators`
* `config-distributors`
@@ -0,0 +1,2 @@
dependencies {
}
@@ -0,0 +1,3 @@
dependencies {
"shadedApi"("commons-io:commons-io:2.6")
}
@@ -0,0 +1,26 @@
package com.dfsek.terra.addons.terrascript.api;
import com.dfsek.terra.addons.terrascript.api.lang.Returnable;
import com.dfsek.terra.addons.terrascript.api.lang.Variable;
import com.dfsek.terra.api.properties.Context;
import java.util.Map;
public interface Function<T> extends Returnable<T> {
Function<?> NULL = new Function<Object>() {
@Override
public ReturnType returnType() {
return null;
}
@Override
public Object apply(Context context, Map<String, Variable<?>> variableMap) {
return null;
}
@Override
public Position getPosition() {
return null;
}
};
}
@@ -1,8 +1,7 @@
package com.dfsek.terra.api.structures.parser.lang.functions;
package com.dfsek.terra.addons.terrascript.api;
import com.dfsek.terra.api.structures.parser.exceptions.ParseException;
import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.addons.terrascript.api.exception.ParseException;
import com.dfsek.terra.addons.terrascript.api.lang.Returnable;
import java.util.List;
@@ -1,4 +1,4 @@
package com.dfsek.terra.api.structures.tokenizer;
package com.dfsek.terra.addons.terrascript.api;
public class Position {
private final int line;
@@ -0,0 +1,13 @@
package com.dfsek.terra.addons.terrascript.api;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
import java.util.Random;
public interface StructureScript extends Structure {
@SuppressWarnings("try")
boolean test(Vector3 location, World world, Random random, Rotation rotation);
}
@@ -1,22 +1,25 @@
package com.dfsek.terra.api.structures.script;
package com.dfsek.terra.addons.terrascript.api;
import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments;
import com.dfsek.terra.api.structures.structure.Rotation;
import com.dfsek.terra.api.structures.structure.buffer.Buffer;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.world.World;
import java.util.Random;
public class TerraImplementationArguments implements ImplementationArguments {
public class TerraProperties implements Properties {
private final Buffer buffer;
private final Rotation rotation;
private final Random random;
private final World world;
private final int recursions;
private boolean waterlog = false;
public TerraImplementationArguments(Buffer buffer, Rotation rotation, Random random, int recursions) {
public TerraProperties(Buffer buffer, Rotation rotation, Random random, World world, int recursions) {
this.buffer = buffer;
this.rotation = rotation;
this.random = random;
this.world = world;
this.recursions = recursions;
}
@@ -43,4 +46,8 @@ public class TerraImplementationArguments implements ImplementationArguments {
public void setWaterlog(boolean waterlog) {
this.waterlog = waterlog;
}
public World getWorld() {
return world;
}
}
@@ -0,0 +1,16 @@
package com.dfsek.terra.addons.terrascript.api;
import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version;
@Addon("api-terrascript")
@Version("1.0.0")
@Author("Terra")
public class TerraScriptAPIAddon extends TerraAddon {
@Override
public void initialize() {
}
}
@@ -0,0 +1,30 @@
package com.dfsek.terra.addons.terrascript.api.buffer;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
import java.util.ArrayList;
import java.util.List;
public class Cell implements BufferedItem {
private final List<BufferedItem> items = new ArrayList<>();
private String mark = null;
@Override
public void paste(Vector3 origin, World world) {
items.forEach(item -> item.paste(origin.clone(), world));
}
public void add(BufferedItem item) {
items.add(item);
}
public String getMark() {
return mark;
}
public void setMark(String mark) {
this.mark = mark;
}
}
@@ -0,0 +1,56 @@
package com.dfsek.terra.addons.terrascript.api.buffer;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Buffer implementation that directly pastes to the world.
*/
public class DirectBuffer implements Buffer {
private final Vector3 origin;
private final World target;
private final Map<Vector3, String> marks = new LinkedHashMap<>();
public DirectBuffer(Vector3 origin, World target) {
this.origin = origin;
this.target = target;
}
@Override
public void paste(Vector3 origin, Chunk chunk) {
// no-op
}
@Override
public void paste(Vector3 origin, World world) {
// no-op
}
@Override
public Buffer addItem(BufferedItem item, Vector3 location) {
item.paste(origin.clone().add(location), target);
return this;
}
@Override
public Vector3 getOrigin() {
return origin;
}
@Override
public String getMark(Vector3 location) {
return marks.get(location);
}
@Override
public Buffer setMark(String mark, Vector3 location) {
marks.put(location, mark);
return this;
}
}
@@ -0,0 +1,48 @@
package com.dfsek.terra.addons.terrascript.api.buffer;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
public class IntermediateBuffer implements Buffer {
private final Buffer original;
private final Vector3 offset;
public IntermediateBuffer(Buffer original, Vector3 offset) {
this.original = original;
this.offset = offset.clone();
}
@Override
public void paste(Vector3 origin, Chunk chunk) {
// no-op
}
@Override
public void paste(Vector3 origin, World world) {
// no-op
}
@Override
public Buffer addItem(BufferedItem item, Vector3 location) {
return original.addItem(item, location.clone().add(offset));
}
@Override
public Vector3 getOrigin() {
return original.getOrigin().clone().add(offset);
}
@Override
public String getMark(Vector3 location) {
return original.getMark(location.clone().add(offset));
}
@Override
public Buffer setMark(String mark, Vector3 location) {
original.setMark(mark, location.clone().add(offset));
return this;
}
}
@@ -0,0 +1,68 @@
package com.dfsek.terra.addons.terrascript.api.buffer;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
import net.jafama.FastMath;
import java.util.LinkedHashMap;
import java.util.Map;
public class StructureBuffer implements Buffer {
private final Map<Vector3, Cell> bufferedItemMap = new LinkedHashMap<>();
private final Vector3 origin;
private boolean succeeded;
public StructureBuffer(Vector3 origin) {
this.origin = origin;
}
public void paste(Vector3 origin, World world) {
bufferedItemMap.forEach(((vector3, item) -> item.paste(origin.clone().add(vector3), world)));
}
public void paste(Vector3 origin, Chunk chunk) {
bufferedItemMap.forEach(((location, item) -> {
Vector3 current = origin.clone().add(location);
if(FastMath.floorDiv(current.getBlockX(), 16) != chunk.getX() || FastMath.floorDiv(current.getBlockZ(), 16) != chunk.getZ())
return;
item.paste(current, chunk.getWorld());
}));
}
@Override
public Buffer addItem(BufferedItem item, Vector3 location) {
bufferedItemMap.computeIfAbsent(location.clone(), l -> new Cell()).add(item);
return this;
}
@Override
public String getMark(Vector3 location) {
Cell cell = bufferedItemMap.get(location);
if(cell != null) {
return cell.getMark();
}
return null;
}
@Override
public Buffer setMark(String mark, Vector3 location) {
bufferedItemMap.computeIfAbsent(location.clone(), l -> new Cell()).setMark(mark);
return this;
}
public void setSucceeded(boolean succeeded) {
this.succeeded = succeeded;
}
public boolean succeeded() {
return succeeded;
}
@Override
public Vector3 getOrigin() {
return origin.clone();
}
}
@@ -0,0 +1,38 @@
package com.dfsek.terra.addons.terrascript.api.buffer.items;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.block.state.properties.base.Properties;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedBlock implements BufferedItem {
private final BlockState data;
private final boolean overwrite;
private final TerraPlugin main;
private final boolean waterlog;
public BufferedBlock(BlockState data, boolean overwrite, TerraPlugin main, boolean waterlog) {
this.data = data;
this.overwrite = overwrite;
this.main = main;
this.waterlog = waterlog;
}
@Override
public void paste(Vector3 origin, World world) {
try {
BlockState current = world.getBlockData(origin);
if(overwrite || current.isAir()) {
if(waterlog && current.has(Properties.WATERLOGGED) && current.getBlockType().isWater()) {
current.set(Properties.WATERLOGGED, true);
}
world.setBlockData(origin, data);
}
} catch(RuntimeException e) {
main.logger().severe("Failed to place block at location " + origin + ": " + e.getMessage());
main.getDebugLogger().stack(e);
}
}
}
@@ -0,0 +1,26 @@
package com.dfsek.terra.addons.terrascript.api.buffer.items;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.event.events.world.generation.EntitySpawnEvent;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedEntity implements BufferedItem {
private final EntityType type;
private final TerraPlugin main;
public BufferedEntity(EntityType type, TerraPlugin main) {
this.type = type;
this.main = main;
}
@Override
public void paste(Vector3 origin, World world) {
Entity entity = world.spawnEntity(origin.clone().add(0.5, 0, 0.5), type);
main.getEventManager().callEvent(new EntitySpawnEvent(entity.world().getConfig().getPack(), entity));
}
}
@@ -1,14 +1,16 @@
package com.dfsek.terra.api.structures.structure.buffer.items;
package com.dfsek.terra.addons.terrascript.api.buffer.items;
import com.dfsek.terra.addons.terrascript.api.StructureScript;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.block.entity.Container;
import com.dfsek.terra.api.event.events.world.generation.LootPopulateEvent;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.block.Block;
import com.dfsek.terra.api.platform.block.state.BlockState;
import com.dfsek.terra.api.platform.block.state.Container;
import com.dfsek.terra.api.structures.loot.LootTable;
import com.dfsek.terra.api.structures.script.StructureScript;
import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.structure.LootTable;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
import java.util.Random;
public class BufferedLootApplication implements BufferedItem {
private final LootTable table;
@@ -22,21 +24,20 @@ public class BufferedLootApplication implements BufferedItem {
}
@Override
public void paste(Location origin) {
public void paste(Vector3 origin, World world) {
try {
Block block = origin.getBlock();
BlockState data = block.getState();
BlockEntity data = world.getBlockState(origin);
if(!(data instanceof Container)) {
main.logger().severe("Failed to place loot at " + origin + "; block " + data + " is not container.");
return;
}
Container container = (Container) data;
LootPopulateEvent event = new LootPopulateEvent(block, container, table, block.getLocation().getWorld().getTerraGenerator().getConfigPack(), structure);
LootPopulateEvent event = new LootPopulateEvent(container, table, world.getConfig().getPack(), structure);
main.getEventManager().callEvent(event);
if(event.isCancelled()) return;
event.getTable().fillInventory(container.getInventory(), new FastRandom(origin.hashCode()));
event.getTable().fillInventory(container.getInventory(), new Random(origin.hashCode()));
data.update(false);
} catch(Exception e) {
main.logger().warning("Could not apply loot at " + origin + ": " + e.getMessage());
@@ -0,0 +1,26 @@
package com.dfsek.terra.addons.terrascript.api.buffer.items;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedPulledBlock implements BufferedItem {
private final BlockState data;
public BufferedPulledBlock(BlockState data) {
this.data = data;
}
@Override
public void paste(Vector3 origin, World world) {
Vector3 mutable = origin.clone();
while(mutable.getY() > world.getMinHeight()) {
if(!world.getBlockData(mutable).isAir()) {
world.setBlockData(mutable, data);
break;
}
mutable.subtract(0, 1, 0);
}
}
}
@@ -1,8 +1,10 @@
package com.dfsek.terra.api.structures.structure.buffer.items;
package com.dfsek.terra.addons.terrascript.api.buffer.items;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.block.state.BlockState;
import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedStateManipulator implements BufferedItem {
private final TerraPlugin main;
@@ -14,9 +16,9 @@ public class BufferedStateManipulator implements BufferedItem {
}
@Override
public void paste(Location origin) {
public void paste(Vector3 origin, World world) {
try {
BlockState state = origin.getBlock().getState();
BlockEntity state = world.getBlockState(origin);
state.applyState(data);
state.update(false);
} catch(Exception e) {
@@ -1,6 +1,6 @@
package com.dfsek.terra.api.structures.parser.exceptions;
package com.dfsek.terra.addons.terrascript.api.exception;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.addons.terrascript.api.Position;
public class ParseException extends Exception {
private static final long serialVersionUID = 6744390543046766386L;
@@ -1,9 +1,7 @@
package com.dfsek.terra.api.structures.parser.lang.constants;
package com.dfsek.terra.addons.terrascript.api.lang;
import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments;
import com.dfsek.terra.api.structures.parser.lang.Returnable;
import com.dfsek.terra.api.structures.parser.lang.variables.Variable;
import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.addons.terrascript.api.Position;
import com.dfsek.terra.api.properties.Context;
import java.util.Map;
@@ -17,7 +15,7 @@ public abstract class ConstantExpression<T> implements Returnable<T> {
}
@Override
public T apply(ImplementationArguments implementationArguments, Map<String, Variable<?>> variableMap) {
public T apply(Context context, Map<String, Variable<?>> variableMap) {
return constant;
}
@@ -0,0 +1,12 @@
package com.dfsek.terra.addons.terrascript.api.lang;
import com.dfsek.terra.addons.terrascript.api.Position;
import com.dfsek.terra.api.properties.Context;
import java.util.Map;
public interface Item<T> {
T apply(Context context, Map<String, Variable<?>> variableMap);
Position getPosition();
}
@@ -0,0 +1,43 @@
package com.dfsek.terra.addons.terrascript.api.lang;
import com.dfsek.terra.addons.terrascript.api.Position;
import com.dfsek.terra.api.properties.Context;
import java.util.Map;
public interface Returnable<T> extends Item<T> {
ReturnType returnType();
enum ReturnType {
NUMBER(true), STRING(true), BOOLEAN(false), VOID(false), OBJECT(false);
private final boolean comparable;
ReturnType(boolean comparable) {
this.comparable = comparable;
}
public boolean isComparable() {
return comparable;
}
}
static <T> Returnable<T> constant(T value, ReturnType type, Position position) {
return new Returnable<T>() {
@Override
public ReturnType returnType() {
return type;
}
@Override
public T apply(Context context, Map<String, Variable<?>> variableMap) {
return value;
}
@Override
public Position getPosition() {
return position;
}
};
}
}
@@ -0,0 +1,13 @@
package com.dfsek.terra.addons.terrascript.api.lang;
import com.dfsek.terra.addons.terrascript.api.Position;
public interface Variable<T> {
T getValue();
void setValue(T value);
Returnable.ReturnType getType();
Position getPosition();
}
@@ -0,0 +1,6 @@
# biome-provider-image
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.
@@ -0,0 +1,2 @@
dependencies {
}
@@ -1,8 +1,7 @@
package com.dfsek.terra.api.world.biome.provider;
package com.dfsek.terra.addons.biome.image;
import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.registry.OpenRegistry;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import net.jafama.FastMath;
import java.awt.*;
@@ -11,7 +10,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class ImageBiomeProvider implements BiomeProvider, BiomeProvider.BiomeProviderBuilder { // This provider does not need a seed, so it is its own builder.
public class ImageBiomeProvider implements BiomeProvider {
private final Map<Color, TerraBiome> colorBiomeMap = new HashMap<>();
private final BufferedImage image;
private final int resolution;
@@ -29,7 +28,7 @@ public class ImageBiomeProvider implements BiomeProvider, BiomeProvider.BiomePro
}
@Override
public TerraBiome getBiome(int x, int z) {
public TerraBiome getBiome(int x, int z, long seed) {
x /= resolution;
z /= resolution;
Color color = align.getColor(image, x, z);
@@ -40,11 +39,6 @@ public class ImageBiomeProvider implements BiomeProvider, BiomeProvider.BiomePro
}));
}
@Override
public BiomeProvider build(long seed) {
return this;
}
public enum Align {
CENTER {
@Override
@@ -0,0 +1,40 @@
package com.dfsek.terra.addons.biome.image;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.util.function.Supplier;
@Addon("biome-provider-image")
@Author("Terra")
@Version("1.0.0")
public class ImageBiomeProviderAddon extends TerraAddon {
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
};
@Inject
private TerraPlugin main;
@Override
public void initialize() {
main.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigPackPreLoadEvent.class)
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(PROVIDER_REGISTRY_KEY);
providerRegistry.register("IMAGE", () -> new ImageProviderTemplate(event.getPack().getRegistry(TerraBiome.class)));
})
.failThrough();
}
}
@@ -0,0 +1,33 @@
package com.dfsek.terra.addons.biome.image;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.awt.image.BufferedImage;
import java.util.HashSet;
public class ImageProviderTemplate implements ObjectTemplate<BiomeProvider> {
private final Registry<TerraBiome> biomes;
@Value("image.name")
private BufferedImage image;
@Value("image.align")
private ImageBiomeProvider.Align align;
@Value("resolution")
@Default
private int resolution = 1;
public ImageProviderTemplate(Registry<TerraBiome> set) {
this.biomes = set;
}
@Override
public BiomeProvider get() {
return new ImageBiomeProvider(new HashSet<>(biomes.entries()), image, resolution, align);
}
}
@@ -0,0 +1,7 @@
# biome-provider-pipeline
Implements the Biome Pipeline, a procedural biome provider that uses a series
of "stages" to apply "mutations" to a 2D grid of biomes.
This addon registers the `PIPELINE` biome provider type, and all associated configurations.
@@ -0,0 +1,2 @@
dependencies {
}
@@ -1,18 +1,19 @@
package com.dfsek.terra.api.world.biome.pipeline;
package com.dfsek.terra.addons.biome.pipeline;
import com.dfsek.terra.api.math.vector.Vector2;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.pipeline.expand.BiomeExpander;
import com.dfsek.terra.api.world.biome.pipeline.mutator.BiomeMutator;
import com.dfsek.terra.api.world.biome.pipeline.source.BiomeSource;
public class TerraBiomeHolder implements BiomeHolder {
public class BiomeHolderImpl implements BiomeHolder {
private final Vector2 origin;
private final int width;
private TerraBiome[][] biomes;
private final int offset;
private TerraBiome[][] biomes;
public TerraBiomeHolder(int width, Vector2 origin) {
public BiomeHolderImpl(int width, Vector2 origin) {
width += 4;
this.width = width;
biomes = new TerraBiome[width][width];
@@ -20,7 +21,7 @@ public class TerraBiomeHolder implements BiomeHolder {
this.offset = 2;
}
private TerraBiomeHolder(TerraBiome[][] biomes, Vector2 origin, int width, int offset) {
private BiomeHolderImpl(TerraBiome[][] biomes, Vector2 origin, int width, int offset) {
this.biomes = biomes;
this.origin = origin;
this.width = width;
@@ -28,7 +29,7 @@ public class TerraBiomeHolder implements BiomeHolder {
}
@Override
public BiomeHolder expand(BiomeExpander expander) {
public BiomeHolder expand(BiomeExpander expander, long seed) {
TerraBiome[][] old = biomes;
int newWidth = width * 2 - 1;
@@ -38,31 +39,31 @@ public class TerraBiomeHolder implements BiomeHolder {
for(int z = 0; z < width; z++) {
biomes[x * 2][z * 2] = old[x][z];
if(z != width - 1)
biomes[x * 2][z * 2 + 1] = expander.getBetween(x + origin.getX(), z + 1 + origin.getZ(), old[x][z], old[x][z + 1]);
biomes[x * 2][z * 2 + 1] = expander.getBetween(x + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z], old[x][z + 1]);
if(x != width - 1)
biomes[x * 2 + 1][z * 2] = expander.getBetween(x + 1 + origin.getX(), z + origin.getZ(), old[x][z], old[x + 1][z]);
biomes[x * 2 + 1][z * 2] = expander.getBetween(x + 1 + origin.getX(), z + origin.getZ(), seed, old[x][z], old[x + 1][z]);
if(x != width - 1 && z != width - 1)
biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), old[x][z], old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]);
biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), seed, old[x][z], old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]);
}
}
return new TerraBiomeHolder(biomes, origin.setX(origin.getX() * 2 - 1).setZ(origin.getZ() * 2 - 1), newWidth, offset);
return new BiomeHolderImpl(biomes, origin.setX(origin.getX() * 2 - 1).setZ(origin.getZ() * 2 - 1), newWidth, offset);
}
@Override
public void mutate(BiomeMutator mutator) {
public void mutate(BiomeMutator mutator, long seed) {
for(int x = 0; x < width; x++) {
for(int z = 0; z < width; z++) {
BiomeMutator.ViewPoint viewPoint = new BiomeMutator.ViewPoint(this, x, z);
biomes[x][z] = mutator.mutate(viewPoint, x + origin.getX(), z + origin.getZ());
biomes[x][z] = mutator.mutate(viewPoint, x + origin.getX(), z + origin.getZ(), seed);
}
}
}
@Override
public void fill(BiomeSource source) {
public void fill(BiomeSource source, long seed) {
for(int x = 0; x < width; x++) {
for(int z = 0; z < width; z++) {
biomes[x][z] = source.getBiome(origin.getX() + x, origin.getZ() + z);
biomes[x][z] = source.getBiome(origin.getX() + x, origin.getZ() + z, seed);
}
}
}
@@ -0,0 +1,65 @@
package com.dfsek.terra.addons.biome.pipeline;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
import com.dfsek.terra.api.vector.Vector2;
import java.util.ArrayList;
import java.util.List;
public class BiomePipeline {
private final BiomeSource source;
private final List<Stage> stages;
private final int size;
private final int init;
private BiomePipeline(BiomeSource source, List<Stage> stages, int size, int init) {
this.source = source;
this.stages = stages;
this.size = size;
this.init = init;
}
/**
* Get biomes in a chunk
*
* @param x Chunk X coord
* @param z Chunk Z coord
* @return BiomeHolder containing biomes.
*/
public BiomeHolder getBiomes(int x, int z, long seed) {
BiomeHolder holder = new BiomeHolderImpl(init, new Vector2(x * (init - 1), z * (init - 1)));
holder.fill(source, seed);
for(Stage stage : stages) holder = stage.apply(holder, seed);
return holder;
}
public int getSize() {
return size;
}
public static final class BiomePipelineBuilder {
private final int init;
List<Stage> stages = new ArrayList<>();
private int expand;
public BiomePipelineBuilder(int init) {
this.init = init;
expand = init;
}
public BiomePipeline build(BiomeSource source) {
for(Stage stage : stages) {
if(stage.isExpansion()) expand = expand * 2 - 1;
}
return new BiomePipeline(source, stages, expand, init);
}
public BiomePipelineBuilder addStage(Stage stage) {
stages.add(stage);
return this;
}
}
}
@@ -0,0 +1,67 @@
package com.dfsek.terra.addons.biome.pipeline;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.BiomePipelineTemplate;
import com.dfsek.terra.addons.biome.pipeline.config.NoiseSourceTemplate;
import com.dfsek.terra.addons.biome.pipeline.config.stage.expander.ExpanderStageTemplate;
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderListMutatorTemplate;
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.BorderMutatorTemplate;
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListMutatorTemplate;
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceMutatorTemplate;
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothMutatorTemplate;
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.util.function.Supplier;
@Addon("biome-provider-pipeline")
@Author("Terra")
@Version("1.0.0")
public class BiomePipelineAddon extends TerraAddon {
public static final TypeKey<Supplier<ObjectTemplate<BiomeSource>>> SOURCE_REGISTRY_KEY = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<Stage>>> STAGE_REGISTRY_KEY = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
};
@Inject
private TerraPlugin main;
@Override
public void initialize() {
main.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigPackPreLoadEvent.class)
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(PROVIDER_REGISTRY_KEY);
providerRegistry.register("PIPELINE", () -> new BiomePipelineTemplate(main));
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<BiomeSource>>> sourceRegistry = event.getPack().getOrCreateRegistry(SOURCE_REGISTRY_KEY);
sourceRegistry.register("NOISE", NoiseSourceTemplate::new);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<Stage>>> stageRegistry = event.getPack().getOrCreateRegistry(STAGE_REGISTRY_KEY);
stageRegistry.register("FRACTAL_EXPAND", ExpanderStageTemplate::new);
stageRegistry.register("SMOOTH", SmoothMutatorTemplate::new);
stageRegistry.register("REPLACE", ReplaceMutatorTemplate::new);
stageRegistry.register("REPLACE_LIST", ReplaceListMutatorTemplate::new);
stageRegistry.register("BORDER", BorderMutatorTemplate::new);
stageRegistry.register("BORDER_LIST", BorderListMutatorTemplate::new);
})
.failThrough();
}
}
@@ -0,0 +1,81 @@
package com.dfsek.terra.addons.biome.pipeline;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import net.jafama.FastMath;
import org.jetbrains.annotations.NotNull;
public class BiomePipelineProvider implements BiomeProvider {
private final LoadingCache<SeededVector, BiomeHolder> holderCache;
private final BiomePipeline pipeline;
private final int resolution;
private final NoiseSampler mutator;
private final double noiseAmp;
public BiomePipelineProvider(BiomePipeline pipeline, TerraPlugin main, int resolution, NoiseSampler mutator, double noiseAmp) {
this.resolution = resolution;
this.mutator = mutator;
this.noiseAmp = noiseAmp;
holderCache = CacheBuilder.newBuilder()
.maximumSize(main == null ? 32 : main.getTerraConfig().getProviderCache())
.build(
new CacheLoader<SeededVector, BiomeHolder>() {
@Override
public BiomeHolder load(@NotNull SeededVector key) {
return pipeline.getBiomes(key.x, key.z, key.seed);
}
}
);
this.pipeline = pipeline;
}
@Override
public TerraBiome getBiome(int x, int z, long seed) {
x += mutator.getNoiseSeeded(seed + 1, x, z) * noiseAmp;
z += mutator.getNoiseSeeded(seed + 2, x, z) * noiseAmp;
x = FastMath.floorToInt(FastMath.floorDiv(x, resolution));
z = FastMath.floorToInt(FastMath.floorDiv(z, resolution));
int fdX = FastMath.floorDiv(x, pipeline.getSize());
int fdZ = FastMath.floorDiv(z, pipeline.getSize());
return holderCache.getUnchecked(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(), z - fdZ * pipeline.getSize());
}
private static final class SeededVector {
private final int x;
private final int z;
private final long seed;
private SeededVector(int x, int z, long seed) {
this.x = x;
this.z = z;
this.seed = seed;
}
@Override
public int hashCode() {
int result = 0;
result = 31 * result + ((int) (seed ^ (seed >>> 32)));
result = 31 * result + x;
result = 31 * result + z;
return result;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof SeededVector)) return false;
SeededVector that = (SeededVector) obj;
return this.seed == that.seed && this.x == that.x && this.z == that.z;
}
}
}
@@ -0,0 +1,7 @@
package com.dfsek.terra.addons.biome.pipeline.api;
import com.dfsek.terra.api.world.biome.TerraBiome;
public interface BiomeExpander {
TerraBiome getBetween(double x, double z, long seed, TerraBiome... others);
}
@@ -0,0 +1,16 @@
package com.dfsek.terra.addons.biome.pipeline.api;
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
import com.dfsek.terra.api.world.biome.TerraBiome;
public interface BiomeHolder {
BiomeHolder expand(BiomeExpander expander, long seed);
void mutate(BiomeMutator mutator, long seed);
void fill(BiomeSource source, long seed);
TerraBiome getBiome(int x, int z);
TerraBiome getBiomeRaw(int x, int z);
}
@@ -1,10 +1,9 @@
package com.dfsek.terra.api.world.biome.pipeline.mutator;
package com.dfsek.terra.addons.biome.pipeline.api;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.pipeline.BiomeHolder;
public interface BiomeMutator {
TerraBiome mutate(ViewPoint viewPoint, double x, double z);
TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed);
class ViewPoint {
private final BiomeHolder biomes;
@@ -0,0 +1,8 @@
package com.dfsek.terra.addons.biome.pipeline.api;
public interface Stage {
boolean isExpansion();
BiomeHolder apply(BiomeHolder in, long seed);
}
@@ -1,13 +1,14 @@
package com.dfsek.terra.config.loaders.config.biome.templates.provider;
package com.dfsek.terra.addons.biome.pipeline.config;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.biome.pipeline.BiomePipeline;
import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.util.seeded.SourceSeeded;
import com.dfsek.terra.api.util.seeded.StageSeeded;
import com.dfsek.terra.api.world.biome.pipeline.BiomePipeline;
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.api.world.biome.provider.StandardBiomeProvider;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.util.List;
@@ -16,23 +17,23 @@ public class BiomePipelineTemplate extends BiomeProviderTemplate {
private final TerraPlugin main;
@Value("pipeline.initial-size")
@Default
private int initialSize = 2;
private @Meta int initialSize = 2;
@Value("pipeline.stages")
private List<StageSeeded> stages;
private @Meta List<@Meta Stage> stages;
@Value("pipeline.source")
private SourceSeeded source;
private @Meta BiomeSource source;
public BiomePipelineTemplate(TerraPlugin main) {
this.main = main;
}
@Override
public BiomeProvider build(long seed) {
public BiomeProvider get() {
BiomePipeline.BiomePipelineBuilder biomePipelineBuilder = new BiomePipeline.BiomePipelineBuilder(initialSize);
stages.forEach(biomePipelineBuilder::addStage);
BiomePipeline pipeline = biomePipelineBuilder.build(source.apply(seed), seed);
return new StandardBiomeProvider(pipeline, main, resolution, blend.apply(seed), blendAmp, (int) seed);
BiomePipeline pipeline = biomePipelineBuilder.build(source);
return new BiomePipelineProvider(pipeline, main, resolution, blend, blendAmp);
}
}
@@ -0,0 +1,16 @@
package com.dfsek.terra.addons.biome.pipeline.config;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.addons.biome.pipeline.BiomePipelineProvider;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.lang.reflect.AnnotatedType;
public class BiomeProviderLoader implements TypeLoader<BiomeProvider> {
@Override
public BiomeProvider load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException {
return loader.loadType(BiomePipelineProvider.class, c); // TODO: actually implement this lol
}
}
@@ -0,0 +1,20 @@
package com.dfsek.terra.addons.biome.pipeline.config;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public abstract class BiomeProviderTemplate implements ObjectTemplate<BiomeProvider> {
@Value("resolution")
@Default
protected @Meta int resolution = 1;
@Value("blend.noise")
@Default
protected @Meta NoiseSampler blend = NoiseSampler.zero();
@Value("blend.amplitude")
@Default
protected @Meta double blendAmp = 0d;
}
@@ -0,0 +1,22 @@
package com.dfsek.terra.addons.biome.pipeline.config;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
import com.dfsek.terra.addons.biome.pipeline.source.NoiseSource;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
public class NoiseSourceTemplate extends SourceTemplate {
@Value("noise")
private @Meta NoiseSampler noise;
@Value("biomes")
private @Meta ProbabilityCollection<@Meta TerraBiome> biomes;
@Override
public BiomeSource get() {
return new NoiseSource(biomes, noise);
}
}
@@ -0,0 +1,8 @@
package com.dfsek.terra.addons.biome.pipeline.config;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
public abstract class SourceTemplate implements ObjectTemplate<BiomeSource> {
}
@@ -0,0 +1,12 @@
package com.dfsek.terra.addons.biome.pipeline.config.stage;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.noise.NoiseSampler;
public abstract class StageTemplate implements ObjectTemplate<Stage> {
@Value("noise")
protected @Meta NoiseSampler noise;
}
@@ -0,0 +1,13 @@
package com.dfsek.terra.addons.biome.pipeline.config.stage.expander;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.expand.FractalExpander;
import com.dfsek.terra.addons.biome.pipeline.stages.ExpanderStage;
public class ExpanderStageTemplate extends StageTemplate {
@Override
public Stage get() {
return new ExpanderStage(new FractalExpander(noise));
}
}
@@ -0,0 +1,33 @@
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.BorderListMutator;
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.Map;
@SuppressWarnings("unused")
public class BorderListMutatorTemplate extends StageTemplate {
@Value("from")
private @Meta String from;
@Value("default-replace")
private @Meta String defaultReplace;
@Value("default-to")
private @Meta ProbabilityCollection<@Meta TerraBiome> defaultTo;
@Value("replace")
private @Meta Map<@Meta TerraBiome, @Meta ProbabilityCollection<@Meta TerraBiome>> replace;
@Override
public Stage get() {
return new MutatorStage(new BorderListMutator(replace, from, defaultReplace, noise, defaultTo));
}
}
@@ -0,0 +1,27 @@
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.BorderMutator;
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
@SuppressWarnings("unused")
public class BorderMutatorTemplate extends StageTemplate {
@Value("from")
private @Meta String from;
@Value("replace")
private @Meta String replace;
@Value("to")
private @Meta ProbabilityCollection<@Meta TerraBiome> to;
@Override
public Stage get() {
return new MutatorStage(new BorderMutator(from, replace, noise, to));
}
}
@@ -0,0 +1,29 @@
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceListMutator;
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.Map;
@SuppressWarnings("unused")
public class ReplaceListMutatorTemplate extends StageTemplate {
@Value("default-from")
private @Meta String defaultFrom;
@Value("default-to")
private @Meta ProbabilityCollection<@Meta TerraBiome> defaultTo;
@Value("to")
private @Meta Map<@Meta TerraBiome, @Meta ProbabilityCollection<@Meta TerraBiome>> replace;
@Override
public Stage get() {
return new MutatorStage(new ReplaceListMutator(replace, defaultFrom, defaultTo, noise));
}
}
@@ -0,0 +1,24 @@
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.ReplaceMutator;
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
@SuppressWarnings("unused")
public class ReplaceMutatorTemplate extends StageTemplate {
@Value("from")
private @Meta String from;
@Value("to")
private @Meta ProbabilityCollection<@Meta TerraBiome> to;
@Override
public Stage get() {
return new MutatorStage(new ReplaceMutator(from, to, noise));
}
}
@@ -0,0 +1,13 @@
package com.dfsek.terra.addons.biome.pipeline.config.stage.mutator;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.config.stage.StageTemplate;
import com.dfsek.terra.addons.biome.pipeline.mutator.SmoothMutator;
import com.dfsek.terra.addons.biome.pipeline.stages.MutatorStage;
public class SmoothMutatorTemplate extends StageTemplate {
@Override
public Stage get() {
return new MutatorStage(new SmoothMutator(noise));
}
}
@@ -0,0 +1,19 @@
package com.dfsek.terra.addons.biome.pipeline.expand;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.world.biome.TerraBiome;
public class FractalExpander implements BiomeExpander {
private final NoiseSampler sampler;
public FractalExpander(NoiseSampler sampler) {
this.sampler = sampler;
}
@Override
public TerraBiome getBetween(double x, double z, long seed, TerraBiome... others) {
return others[MathUtil.normalizeIndex(sampler.getNoiseSeeded(seed, x, z), others.length)];
}
}
@@ -1,7 +1,8 @@
package com.dfsek.terra.api.world.biome.pipeline.mutator;
package com.dfsek.terra.addons.biome.pipeline.mutator;
import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.util.collections.ProbabilityCollection;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.Map;
@@ -22,7 +23,7 @@ public class BorderListMutator implements BiomeMutator {
}
@Override
public TerraBiome mutate(ViewPoint viewPoint, double x, double z) {
public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) {
TerraBiome origin = viewPoint.getBiome(0, 0);
if(origin.getTags().contains(defaultReplace)) {
for(int xi = -1; xi <= 1; xi++) {
@@ -32,10 +33,10 @@ public class BorderListMutator implements BiomeMutator {
if(current == null) continue;
if(current.getTags().contains(border)) {
if(replace.containsKey(origin)) {
TerraBiome biome = replace.get(origin).get(noiseSampler, x, z);
TerraBiome biome = replace.get(origin).get(noiseSampler, x, z, seed);
return biome == null ? origin : biome;
}
TerraBiome biome = replaceDefault.get(noiseSampler, x, z);
TerraBiome biome = replaceDefault.get(noiseSampler, x, z, seed);
return biome == null ? origin : biome;
}
}
@@ -1,7 +1,8 @@
package com.dfsek.terra.api.world.biome.pipeline.mutator;
package com.dfsek.terra.addons.biome.pipeline.mutator;
import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.util.collections.ProbabilityCollection;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
public class BorderMutator implements BiomeMutator {
@@ -18,7 +19,7 @@ public class BorderMutator implements BiomeMutator {
}
@Override
public TerraBiome mutate(ViewPoint viewPoint, double x, double z) {
public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) {
TerraBiome origin = viewPoint.getBiome(0, 0);
if(origin.getTags().contains(replaceTag)) {
for(int xi = -1; xi <= 1; xi++) {
@@ -27,7 +28,7 @@ public class BorderMutator implements BiomeMutator {
TerraBiome current = viewPoint.getBiome(xi, zi);
if(current == null) continue;
if(current.getTags().contains(border)) {
TerraBiome biome = replace.get(noiseSampler, x, z);
TerraBiome biome = replace.get(noiseSampler, x, z, seed);
return biome == null ? origin : biome;
}
}
@@ -1,7 +1,8 @@
package com.dfsek.terra.api.world.biome.pipeline.mutator;
package com.dfsek.terra.addons.biome.pipeline.mutator;
import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.util.collections.ProbabilityCollection;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.Map;
@@ -20,14 +21,14 @@ public class ReplaceListMutator implements BiomeMutator {
}
@Override
public TerraBiome mutate(ViewPoint viewPoint, double x, double z) {
public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) {
TerraBiome center = viewPoint.getBiome(0, 0);
if(replace.containsKey(center)) {
TerraBiome biome = replace.get(center).get(sampler, x, z);
TerraBiome biome = replace.get(center).get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome;
}
if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) {
TerraBiome biome = replaceDefault.get(sampler, x, z);
TerraBiome biome = replaceDefault.get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome;
}
return center;
@@ -1,7 +1,8 @@
package com.dfsek.terra.api.world.biome.pipeline.mutator;
package com.dfsek.terra.addons.biome.pipeline.mutator;
import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.api.util.collections.ProbabilityCollection;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
public class ReplaceMutator implements BiomeMutator {
@@ -16,9 +17,9 @@ public class ReplaceMutator implements BiomeMutator {
}
@Override
public TerraBiome mutate(ViewPoint viewPoint, double x, double z) {
public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) {
if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) {
TerraBiome biome = replace.get(sampler, x, z);
TerraBiome biome = replace.get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome;
}
return viewPoint.getBiome(0, 0);
@@ -1,7 +1,8 @@
package com.dfsek.terra.api.world.biome.pipeline.mutator;
package com.dfsek.terra.addons.biome.pipeline.mutator;
import com.dfsek.terra.api.math.MathUtil;
import com.dfsek.terra.api.math.noise.NoiseSampler;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.world.biome.TerraBiome;
import java.util.Objects;
@@ -15,7 +16,7 @@ public class SmoothMutator implements BiomeMutator {
}
@Override
public TerraBiome mutate(ViewPoint viewPoint, double x, double z) {
public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) {
TerraBiome top = viewPoint.getBiome(1, 0);
TerraBiome bottom = viewPoint.getBiome(-1, 0);
TerraBiome left = viewPoint.getBiome(0, 1);
@@ -26,7 +27,7 @@ public class SmoothMutator implements BiomeMutator {
boolean horiz = Objects.equals(left, right) && left != null;
if(vert && horiz) {
return MathUtil.normalizeIndex(sampler.getNoise(x, z), 2) == 0 ? left : top;
return MathUtil.normalizeIndex(sampler.getNoiseSeeded(seed, x, z), 2) == 0 ? left : top;
}
if(vert) return top;
@@ -0,0 +1,7 @@
package com.dfsek.terra.addons.biome.pipeline.source;
import com.dfsek.terra.api.world.biome.TerraBiome;
public interface BiomeSource {
TerraBiome getBiome(double x, double z, long seed);
}
@@ -0,0 +1,20 @@
package com.dfsek.terra.addons.biome.pipeline.source;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.TerraBiome;
public class NoiseSource implements BiomeSource {
private final ProbabilityCollection<TerraBiome> biomes;
private final NoiseSampler sampler;
public NoiseSource(ProbabilityCollection<TerraBiome> biomes, NoiseSampler sampler) {
this.biomes = biomes;
this.sampler = sampler;
}
@Override
public TerraBiome getBiome(double x, double z, long seed) {
return biomes.get(sampler, x, z, seed);
}
}
@@ -0,0 +1,27 @@
package com.dfsek.terra.addons.biome.pipeline.stages;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeExpander;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
public class ExpanderStage implements Stage {
private final BiomeExpander expander;
public ExpanderStage(BiomeExpander expander) {
this.expander = expander;
}
@Override
public boolean isExpansion() {
return true;
}
@Override
public BiomeHolder apply(BiomeHolder in, long seed) {
return in.expand(expander, seed);
}
public enum Type {
FRACTAL
}
}
@@ -1,7 +1,8 @@
package com.dfsek.terra.api.world.biome.pipeline.stages;
package com.dfsek.terra.addons.biome.pipeline.stages;
import com.dfsek.terra.api.world.biome.pipeline.BiomeHolder;
import com.dfsek.terra.api.world.biome.pipeline.mutator.BiomeMutator;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeHolder;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeMutator;
import com.dfsek.terra.addons.biome.pipeline.api.Stage;
public class MutatorStage implements Stage {
private final BiomeMutator mutator;
@@ -16,8 +17,8 @@ public class MutatorStage implements Stage {
}
@Override
public BiomeHolder apply(BiomeHolder in) {
in.mutate(mutator);
public BiomeHolder apply(BiomeHolder in, long seed) {
in.mutate(mutator, seed);
return in;
}
@@ -0,0 +1,4 @@
# biome-provider-single
Registers and configures the `SINGLE` biome provider, a biome provider which
accepts a single biome to generate continuously.
@@ -0,0 +1,2 @@
dependencies {
}
@@ -0,0 +1,17 @@
package com.dfsek.terra.addons.biome.single;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class SingleBiomeProvider implements BiomeProvider {
private final TerraBiome biome;
public SingleBiomeProvider(TerraBiome biome) {
this.biome = biome;
}
@Override
public TerraBiome getBiome(int x, int z, long seed) {
return biome;
}
}
@@ -0,0 +1,39 @@
package com.dfsek.terra.addons.biome.single;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.util.function.Supplier;
@Addon("biome-provider-single")
@Author("Terra")
@Version("1.0.0")
public class SingleBiomeProviderAddon extends TerraAddon {
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
};
@Inject
private TerraPlugin main;
@Override
public void initialize() {
main.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigPackPreLoadEvent.class)
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(PROVIDER_REGISTRY_KEY);
providerRegistry.register("SINGLE", SingleBiomeProviderTemplate::new);
})
.failThrough();
}
}
@@ -0,0 +1,17 @@
package com.dfsek.terra.addons.biome.single;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class SingleBiomeProviderTemplate implements ObjectTemplate<BiomeProvider> {
@Value("biome")
private @Meta TerraBiome biome;
@Override
public BiomeProvider get() {
return new SingleBiomeProvider(biome);
}
}
@@ -0,0 +1,4 @@
# chunk-generator-noise-3d
Registers the `NOISE_3D` chunk generator, a chunk generator which uses biomes'
samplers in 3D to generate chunk data.
@@ -0,0 +1,2 @@
dependencies {
}
@@ -0,0 +1,30 @@
package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.world.generator.Palette;
public class BiomePaletteTemplate implements ObjectTemplate<PaletteInfo> {
@Value("palette")
private @Meta PaletteHolder palette;
@Value("slant")
@Default
private @Meta SlantHolder slant = null;
@Value("ocean.level")
private @Meta int seaLevel;
@Value("ocean.palette")
private @Meta Palette oceanPalette;
@Override
public PaletteInfo get() {
return new PaletteInfo(palette, slant, oceanPalette, seaLevel);
}
}
@@ -0,0 +1,50 @@
package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.terra.addons.chunkgenerator.generation.generators.NoiseChunkGenerator3D;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolderLoader;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolderLoader;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version;
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.injection.annotations.Inject;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
@Addon("chunk-generator-noise-3d")
@Author("Terra")
@Version("1.0.0")
public class NoiseChunkGenerator3DAddon extends TerraAddon {
@Inject
private TerraPlugin main;
@Override
public void initialize() {
main.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigPackPreLoadEvent.class)
.then(event -> {
event.getPack().getOrCreateRegistry(ChunkGeneratorProvider.class).register("NOISE_3D", pack -> new NoiseChunkGenerator3D(pack, main));
event.getPack()
.applyLoader(SlantHolder.class, new SlantHolderLoader())
.applyLoader(PaletteHolder.class, new PaletteHolderLoader());
})
.failThrough();
main.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigurationLoadEvent.class)
.then(event -> {
if(event.is(TerraBiome.class)) {
event.getLoadedObject(TerraBiome.class).getContext().put(event.load(new BiomePaletteTemplate()).get());
}
})
.failThrough();
}
}
@@ -0,0 +1,22 @@
package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo;
import com.dfsek.terra.addons.chunkgenerator.palette.SlantHolder;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.generator.Palette;
import com.dfsek.terra.api.world.generator.Sampler;
public final class PaletteUtil {
public static Palette getPalette(int x, int y, int z, GenerationSettings c, Sampler sampler, PaletteInfo paletteInfo) {
SlantHolder slant = paletteInfo.getSlantHolder();
if(slant != null) {
double slope = MathUtil.derivative(sampler, x, y, z);
if(slope > slant.getMinSlope()) {
return slant.getPalette(slope).getPalette(y);
}
}
return paletteInfo.getPaletteHolder().getPalette(y);
}
}
@@ -0,0 +1,189 @@
package com.dfsek.terra.addons.chunkgenerator.generation.generators;
import com.dfsek.terra.addons.chunkgenerator.PaletteUtil;
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteInfo;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.block.state.properties.base.Properties;
import com.dfsek.terra.api.block.state.properties.enums.Direction;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.BiomeGrid;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.ChunkData;
import com.dfsek.terra.api.world.generator.ChunkGenerator;
import com.dfsek.terra.api.world.generator.GenerationStage;
import com.dfsek.terra.api.world.generator.Palette;
import com.dfsek.terra.api.world.generator.Sampler;
import net.jafama.FastMath;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class NoiseChunkGenerator3D implements ChunkGenerator {
private final ConfigPack configPack;
private final TerraPlugin main;
private final List<GenerationStage> generationStages = new ArrayList<>();
private final BlockState air;
public NoiseChunkGenerator3D(ConfigPack c, TerraPlugin main) {
this.configPack = c;
this.main = main;
this.air = main.getWorldHandle().air();
c.getStages().forEach(stage -> generationStages.add(stage.newInstance(c)));
}
@SuppressWarnings({"try"})
static void biomes(@NotNull World world, int chunkX, int chunkZ, @NotNull BiomeGrid biome, TerraPlugin main) {
try(ProfileFrame ignore = main.getProfiler().profile("biomes")) {
int xOrig = (chunkX << 4);
int zOrig = (chunkZ << 4);
long seed = world.getSeed();
BiomeProvider grid = world.getBiomeProvider();
for(int x = 0; x < 4; x++) {
for(int z = 0; z < 4; z++) {
int cx = xOrig + (x << 2);
int cz = zOrig + (z << 2);
TerraBiome b = grid.getBiome(cx, cz, seed);
biome.setBiome(cx, cz, b.getVanillaBiomes().get(b.getGenerator().getBiomeNoise(), cx, 0, cz, world.getSeed()));
}
}
}
}
@Override
public ConfigPack getConfigPack() {
return configPack;
}
@Override
public TerraPlugin getMain() {
return main;
}
@Override
@SuppressWarnings({"try"})
public ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkData chunk) {
try(ProfileFrame ignore = main.getProfiler().profile("chunk_base_3d")) {
BiomeProvider grid = world.getBiomeProvider();
int xOrig = (chunkX << 4);
int zOrig = (chunkZ << 4);
Sampler sampler = world.getConfig().getSamplerCache().getChunk(chunkX, chunkZ);
long seed = world.getSeed();
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
int paletteLevel = 0;
int cx = xOrig + x;
int cz = zOrig + z;
TerraBiome biome = grid.getBiome(cx, cz, seed);
PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class);
if(paletteInfo == null) {
main.logger().info("null palette: " + biome.getID());
}
GenerationSettings generationSettings = biome.getGenerator();
int sea = paletteInfo.getSeaLevel();
Palette seaPalette = paletteInfo.getOcean();
boolean justSet = false;
BlockState data = null;
for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) {
if(sampler.sample(x, y, z) > 0) {
justSet = true;
data = PaletteUtil.getPalette(x, y, z, generationSettings, sampler, paletteInfo).get(paletteLevel, cx, y, cz, seed);
chunk.setBlock(x, y, z, data);
paletteLevel++;
} else if(y <= sea) {
chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig, seed));
justSet = false;
paletteLevel = 0;
} else {
justSet = false;
paletteLevel = 0;
}
}
}
}
return chunk;
}
}
private boolean placeStair(BlockState orig, ChunkData chunk, Vector3 block, double thresh, Sampler sampler, BlockState stairNew) {
if(sampler.sample(block.getBlockX() - 0.55, block.getY(), block.getZ()) > thresh) {
stairNew.set(Properties.DIRECTION, Direction.WEST);
} else if(sampler.sample(block.getBlockX(), block.getY(), block.getZ() - 0.55) > thresh) {
stairNew.set(Properties.DIRECTION, Direction.NORTH);
} else if(sampler.sample(block.getBlockX(), block.getY(), block.getZ() + 0.55) > thresh) {
stairNew.set(Properties.DIRECTION, Direction.SOUTH);
} else if(sampler.sample(block.getX() + 0.55, block.getY(), block.getZ()) > thresh) {
stairNew.set(Properties.DIRECTION, Direction.EAST);
} else stairNew = null;
if(stairNew != null) {
stairNew.setIfPresent(Properties.WATERLOGGED, orig.getBlockType().isWater());
chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), stairNew);
return true;
}
return false;
}
@Override
public void generateBiomes(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome) {
biomes(world, chunkX, chunkZ, biome, main);
}
@Override
public Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth) {
return new Sampler3D(chunkX, chunkZ, provider, world, elevationSmooth);
}
@Override
public List<GenerationStage> getGenerationStages() {
return generationStages;
}
@Override
public BlockState getBlock(World world, int x, int y, int z) {
BiomeProvider provider = world.getBiomeProvider();
TerraBiome biome = provider.getBiome(x, z, world.getSeed());
Sampler sampler = world.getConfig().getSamplerCache().get(x, z);
PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class);
Palette palette = PaletteUtil.getPalette(x, y, z, biome.getGenerator(), sampler, paletteInfo);
int fdX = FastMath.floorMod(x, 16);
int fdZ = FastMath.floorMod(z, 16);
double noise = sampler.sample(fdX, y, fdZ);
if(noise > 0) {
int level = 0;
for(int yi = world.getMaxHeight() - 1; yi > y; yi--) {
if(sampler.sample(fdX, yi, fdZ) > 0) level++;
else level = 0;
}
return palette.get(level, x, y, z, world.getSeed());
} else if(y <= paletteInfo.getSeaLevel()) {
return paletteInfo.getOcean().get(paletteInfo.getSeaLevel() - y, x, y, z, world.getSeed());
} else return air;
}
}
@@ -1,10 +1,11 @@
package com.dfsek.terra.world.generation.math.interpolation;
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.terra.api.math.vector.Vector3;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.util.mutable.MutableInteger;
import com.dfsek.terra.api.world.biome.Generator;
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.ChunkInterpolator;
import net.jafama.FastMath;
import java.util.HashMap;
@@ -17,7 +18,7 @@ import java.util.function.BiFunction;
*/
public class ChunkInterpolator2D implements ChunkInterpolator {
private final Interpolator[][] interpGrid = new Interpolator[4][4];
private final BiFunction<Generator, Vector3, Double> noiseGetter;
private final BiFunction<GenerationSettings, Vector3, Double> noiseGetter;
/**
* Instantiates a 3D ChunkInterpolator3D at a pair of chunk coordinates.
@@ -26,24 +27,26 @@ public class ChunkInterpolator2D implements ChunkInterpolator {
* @param chunkZ Z coordinate of the chunk.
* @param provider Biome Provider to use for biome fetching.
*/
public ChunkInterpolator2D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction<Generator, Vector3, Double> noiseGetter) {
public ChunkInterpolator2D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction<GenerationSettings, Vector3, Double> noiseGetter) {
this.noiseGetter = noiseGetter;
int xOrigin = chunkX << 4;
int zOrigin = chunkZ << 4;
long seed = w.getSeed();
double[][] noiseStorage = new double[5][5];
for(int x = 0; x < 5; x++) {
for(int z = 0; z < 5; z++) {
Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2)).getGenerator(w);
Map<Generator, MutableInteger> genMap = new HashMap<>();
GenerationSettings generationSettings = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator();
Map<GenerationSettings, MutableInteger> genMap = new HashMap<>();
int step = generator.getBlendStep();
int blend = generator.getBlendDistance();
int step = generationSettings.getBlendStep();
int blend = generationSettings.getBlendDistance();
for(int xi = -blend; xi <= blend; xi++) {
for(int zi = -blend; zi <= blend; zi++) {
genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step)).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1
genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(), g -> new MutableInteger(0)).increment(); // Increment by 1
}
}
@@ -66,8 +69,8 @@ public class ChunkInterpolator2D implements ChunkInterpolator {
return FastMath.max(FastMath.min(value, high), 0);
}
public double computeNoise(Generator generator, double x, double y, double z) {
return noiseGetter.apply(generator, new Vector3(x, y, z));
public double computeNoise(GenerationSettings generationSettings, double x, double y, double z) {
return noiseGetter.apply(generationSettings, new Vector3(x, y, z));
}
/**
@@ -1,10 +1,11 @@
package com.dfsek.terra.world.generation.math.interpolation;
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.terra.api.math.vector.Vector3;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.util.mutable.MutableInteger;
import com.dfsek.terra.api.world.biome.Generator;
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.ChunkInterpolator;
import net.jafama.FastMath;
import java.util.HashMap;
@@ -17,7 +18,7 @@ import java.util.function.BiFunction;
*/
public class ChunkInterpolator3D implements ChunkInterpolator {
private final Interpolator3[][][] interpGrid;
private final BiFunction<Generator, Vector3, Double> noiseGetter;
private final BiFunction<GenerationSettings, Vector3, Double> noiseGetter;
private final int min;
private final int max;
@@ -29,7 +30,7 @@ public class ChunkInterpolator3D implements ChunkInterpolator {
* @param chunkZ Z coordinate of the chunk.
* @param provider Biome Provider to use for biome fetching.
*/
public ChunkInterpolator3D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction<Generator, Vector3, Double> noiseGetter) {
public ChunkInterpolator3D(World w, int chunkX, int chunkZ, BiomeProvider provider, BiFunction<GenerationSettings, Vector3, Double> noiseGetter) {
this.noiseGetter = noiseGetter;
int xOrigin = chunkX << 4;
int zOrigin = chunkZ << 4;
@@ -44,17 +45,19 @@ public class ChunkInterpolator3D implements ChunkInterpolator {
double[][][] noiseStorage = new double[5][5][size + 1];
long seed = w.getSeed();
for(int x = 0; x < 5; x++) {
for(int z = 0; z < 5; z++) {
Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2)).getGenerator(w);
Map<Generator, MutableInteger> genMap = new HashMap<>();
GenerationSettings generationSettings = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator();
Map<GenerationSettings, MutableInteger> genMap = new HashMap<>();
int step = generator.getBlendStep();
int blend = generator.getBlendDistance();
int step = generationSettings.getBlendStep();
int blend = generationSettings.getBlendDistance();
for(int xi = -blend; xi <= blend; xi++) {
for(int zi = -blend; zi <= blend; zi++) {
genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step)).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1
genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(), g -> new MutableInteger(0)).increment(); // Increment by 1
}
}
@@ -81,14 +84,14 @@ public class ChunkInterpolator3D implements ChunkInterpolator {
}
}
public double computeNoise(Generator generator, double x, double y, double z) {
return noiseGetter.apply(generator, new Vector3(x, y, z));
}
private static int reRange(int value, int high) {
return FastMath.max(FastMath.min(value, high), 0);
}
public double computeNoise(GenerationSettings generationSettings, double x, double y, double z) {
return noiseGetter.apply(generationSettings, new Vector3(x, y, z));
}
/**
* Gets the noise at a pair of internal chunk coordinates.
*
@@ -1,9 +1,8 @@
package com.dfsek.terra.world.generation.math.interpolation;
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.world.biome.Generator;
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.world.generation.WorldGenerator;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.GenerationSettings;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class ElevationInterpolator {
private final double[][] values = new double[18][18];
@@ -12,12 +11,14 @@ public class ElevationInterpolator {
int xOrigin = chunkX << 4;
int zOrigin = chunkZ << 4;
WorldGenerator[][] gens = new WorldGenerator[18 + 2 * smooth][18 + 2 * smooth];
long seed = world.getSeed();
GenerationSettings[][] gens = new GenerationSettings[18 + 2 * smooth][18 + 2 * smooth];
// Precompute generators.
for(int x = -1 - smooth; x <= 16 + smooth; x++) {
for(int z = -1 - smooth; z <= 16 + smooth; z++) {
gens[x + 1 + smooth][z + 1 + smooth] = (WorldGenerator) provider.getBiome(xOrigin + x, zOrigin + z).getGenerator(world);
gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, zOrigin + z, seed).getGenerator();
}
}
@@ -27,8 +28,8 @@ public class ElevationInterpolator {
double div = 0;
for(int xi = -smooth; xi <= smooth; xi++) {
for(int zi = -smooth; zi <= smooth; zi++) {
Generator gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi];
noise += gen.getElevationSampler().getNoise(xOrigin + x, zOrigin + z) * gen.getElevationWeight();
GenerationSettings gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi];
noise += gen.getElevationSampler().getNoiseSeeded(seed, xOrigin + x, zOrigin + z) * gen.getElevationWeight();
div += gen.getElevationWeight();
}
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.world.generation.math.interpolation;
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
/**
* Class for bilinear interpolation of values arranged on a unit square.
@@ -1,4 +1,4 @@
package com.dfsek.terra.world.generation.math.interpolation;
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
/**
* Class for bilinear interpolation of values arranged on a unit square.
@@ -1,9 +1,10 @@
package com.dfsek.terra.world.generation.math.samplers;
package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.world.generation.math.interpolation.ChunkInterpolator3D;
import com.dfsek.terra.world.generation.math.interpolation.ElevationInterpolator;
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ChunkInterpolator3D;
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ElevationInterpolator;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.Sampler;
import net.jafama.FastMath;
public class Sampler3D implements Sampler {
@@ -11,7 +12,7 @@ public class Sampler3D implements Sampler {
private final ElevationInterpolator elevationInterpolator;
public Sampler3D(int x, int z, BiomeProvider provider, World world, int elevationSmooth) {
this.interpolator = new ChunkInterpolator3D(world, x, z, provider, (generator, coord) -> generator.getBaseSampler().getNoise(coord));
this.interpolator = new ChunkInterpolator3D(world, x, z, provider, (generator, coord) -> generator.getBaseSampler().getNoiseSeeded(coord, world.getSeed()));
this.elevationInterpolator = new ElevationInterpolator(world, x, z, provider, elevationSmooth);
}
@@ -1,18 +1,17 @@
package com.dfsek.terra.api.world.palette.holder;
package com.dfsek.terra.addons.chunkgenerator.palette;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.generator.Palette;
public class PaletteHolder {
private final Palette<BlockData>[] palettes;
private final Palette[] palettes;
private final int offset;
protected PaletteHolder(Palette<BlockData>[] palettes, int offset) {
protected PaletteHolder(Palette[] palettes, int offset) {
this.palettes = palettes;
this.offset = offset;
}
public Palette<BlockData> getPalette(int y) {
public Palette getPalette(int y) {
int index = y + offset;
return index >= 0
? index < palettes.length
@@ -1,30 +1,28 @@
package com.dfsek.terra.api.world.palette.holder;
package com.dfsek.terra.addons.chunkgenerator.palette;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.api.world.generator.Palette;
import net.jafama.FastMath;
import java.util.Map;
import java.util.TreeMap;
public class PaletteHolderBuilder {
private final TreeMap<Integer, Palette<BlockData>> paletteMap = new TreeMap<>();
private final TreeMap<Integer, Palette> paletteMap = new TreeMap<>();
public PaletteHolderBuilder add(int y, Palette<BlockData> palette) {
public PaletteHolderBuilder add(int y, Palette palette) {
paletteMap.put(y, palette);
return this;
}
@SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"})
public PaletteHolder build() {
int min = FastMath.min(paletteMap.keySet().stream().min(Integer::compareTo).orElse(0), 0);
int max = FastMath.max(paletteMap.keySet().stream().max(Integer::compareTo).orElse(255), 255);
Palette<BlockData>[] palettes = new Palette[paletteMap.lastKey() + 1 - min];
Palette[] palettes = new Palette[paletteMap.lastKey() + 1 - min];
for(int y = min; y <= FastMath.max(paletteMap.lastKey(), max); y++) {
Palette<BlockData> d = null;
for(Map.Entry<Integer, Palette<BlockData>> e : paletteMap.entrySet()) {
Palette d = null;
for(Map.Entry<Integer, Palette> e : paletteMap.entrySet()) {
if(e.getKey() >= y) {
d = e.getValue();
break;
@@ -0,0 +1,25 @@
package com.dfsek.terra.addons.chunkgenerator.palette;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.world.generator.Palette;
import java.lang.reflect.AnnotatedType;
import java.util.List;
import java.util.Map;
public class PaletteHolderLoader implements TypeLoader<PaletteHolder> {
@SuppressWarnings("unchecked")
@Override
public PaletteHolder load(AnnotatedType type, Object o, ConfigLoader configLoader) throws LoadException {
List<Map<String, Integer>> palette = (List<Map<String, Integer>>) o;
PaletteHolderBuilder builder = new PaletteHolderBuilder();
for(Map<String, Integer> layer : palette) {
for(Map.Entry<String, Integer> entry : layer.entrySet()) {
builder.add(entry.getValue(), configLoader.loadType(Palette.class, entry.getKey()));
}
}
return builder.build();
}
}
@@ -0,0 +1,35 @@
package com.dfsek.terra.addons.chunkgenerator.palette;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.generator.Palette;
public class PaletteInfo implements Properties {
private final PaletteHolder paletteHolder;
private final SlantHolder slantHolder;
private final Palette ocean;
private final int seaLevel;
public PaletteInfo(PaletteHolder paletteHolder, SlantHolder slantHolder, Palette ocean, int seaLevel) {
this.paletteHolder = paletteHolder;
this.slantHolder = slantHolder;
this.ocean = ocean;
this.seaLevel = seaLevel;
}
public Palette getOcean() {
return ocean;
}
public PaletteHolder getPaletteHolder() {
return paletteHolder;
}
public SlantHolder getSlantHolder() {
return slantHolder;
}
public int getSeaLevel() {
return seaLevel;
}
}
@@ -0,0 +1,22 @@
package com.dfsek.terra.addons.chunkgenerator.palette;
import java.util.TreeMap;
public class SlantHolder {
private final TreeMap<Double, PaletteHolder> layers;
private final double minSlope;
public SlantHolder(TreeMap<Double, PaletteHolder> layers, double minSlope) {
this.layers = layers;
this.minSlope = minSlope;
}
public PaletteHolder getPalette(double slope) {
return layers.floorEntry(slope).getValue();
}
public double getMinSlope() {
return minSlope;
}
}
@@ -0,0 +1,28 @@
package com.dfsek.terra.addons.chunkgenerator.palette;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import java.lang.reflect.AnnotatedType;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@SuppressWarnings("unchecked")
public class SlantHolderLoader implements TypeLoader<SlantHolder> {
@Override
public SlantHolder load(AnnotatedType type, Object o, ConfigLoader configLoader) throws LoadException {
List<Map<Object, Object>> layers = (List<Map<Object, Object>>) o;
TreeMap<Double, PaletteHolder> slantLayers = new TreeMap<>();
double minThreshold = Double.MAX_VALUE;
for(Map<Object, Object> layer : layers) {
double threshold = ((Number) layer.get("threshold")).doubleValue();
if(threshold < minThreshold) minThreshold = threshold;
slantLayers.put(threshold, configLoader.loadType(PaletteHolder.class, layer.get("palette")));
}
return new SlantHolder(slantLayers, minThreshold);
}
}
+3
View File
@@ -0,0 +1,3 @@
# config-biome
Registers the default configuration for Terra Biomes, `BIOME`.
@@ -0,0 +1,2 @@
dependencies {
}
@@ -0,0 +1,32 @@
package com.dfsek.terra.addons.biome;
import com.dfsek.terra.addons.biome.holder.PaletteHolder;
import com.dfsek.terra.addons.biome.holder.PaletteHolderLoader;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.injection.annotations.Inject;
@Addon("config-biome")
@Author("Terra")
@Version("1.0.0")
public class BiomeAddon extends TerraAddon {
@Inject
private TerraPlugin main;
@Override
public void initialize() {
main.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigPackPreLoadEvent.class)
.then(event -> {
event.getPack().registerConfigType(new BiomeConfigType(event.getPack()), "BIOME", 5);
event.getPack().applyLoader(PaletteHolder.class, new PaletteHolderLoader());
})
.failThrough();
}
}

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