From e6faa50a66af5115939e08eeef779613cc93527b Mon Sep 17 00:00:00 2001 From: FITFC <101124415+FITFC@users.noreply.github.com> Date: Sat, 29 Oct 2022 18:23:42 -0500 Subject: [PATCH 01/24] added pt_br.json --- .../resources/assets/bclib/lang/pt_br.json | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/main/resources/assets/bclib/lang/pt_br.json diff --git a/src/main/resources/assets/bclib/lang/pt_br.json b/src/main/resources/assets/bclib/lang/pt_br.json new file mode 100644 index 00000000..0cb2e1ad --- /dev/null +++ b/src/main/resources/assets/bclib/lang/pt_br.json @@ -0,0 +1,103 @@ +{ + "message.bclib.anvil_damage": "§cDano", + "bclib.datafixer.backupWarning.title": "Guardian detectou um mundo incompatível", + "bclib.datafixer.backupWarning.message": "O Guardian detectou, que os internos alguns mods instalados mudaram desde que este mundo foi jogado pela última vez.\n\nPodemos mudar automaticamente o mundo para você.Se você continuar sem aplicar as alterações, o mundo pode não carregar correto.Antes de continuar, você deve criar um backup.", + "bclib.datafixer.backupWarning.backup": "Crie backup antes de aplicar correções", + "bclib.datafixer.backupWarning.nofixes": "Continue sem correções", + "bclib.datafixer.backupWarning.fix": "Aplique correções", + "title.bclib.bclibmissmatch": "Incompatibilidade de versão", + "message.bclib.bclibmissmatch": "A versão do BCLIB no servidor e esse cliente não corresponde.Isso causará problemas ao jogar.\n\nVocê deseja baixar automaticamente a versão bclib do servidor? \n\nO BCLIB moverá a versão antiga para um subdiretório do seu mods-dobrador e antes de instalar o novo.", + "title.bclib.syncfiles": "Dados incompatíveis", + "message.bclib.syncfiles": "Algum conteúdo no servidor não corresponde às versões do cliente.\nDeseja substituir o conteúdo selecionado pelos dados do servidor?", + "message.bclib.syncfiles.mods": "Sincronize mods", + "message.bclib.syncfiles.configs": "Sincronize as configurações", + "message.bclib.syncfiles.folders": "Sincronize pastas e arquivos", + "message.bclib.syncfiles.delete": "Exclua desnecessário", + "title.bclib.confirmrestart": "É necessário reiniciar", + "message.bclib.confirmrestart": "O conteúdo solicitado foi sincronizado.Você precisa reiniciar o minecraft agora.", + "title.link.bclib.discord": "Discórdia", + "title.bclib.modmenu.main": "Configurações do BCLIB", + "title.bclib.progress": "Progresso", + "title.bclib.filesync.progress": "Transferência de arquivo", + "message.bclib.filesync.progress": "Sincronizar o conteúdo do arquivo com o servidor", + "message.bclib.filesync.progress.stage.empty": "", + "title.config.bclib.client.auto_sync.enabled": "Ativar sincronização automática", + "title.config.bclib.client.auto_sync.acceptConfigs": "Accept incoming Config Files", + "title.config.bclib.client.auto_sync.acceptFiles": "Aceitar arquivos de entrada", + "title.config.bclib.client.auto_sync.acceptMods": "Aceitar mods de entrada", + "title.config.bclib.client.auto_sync.displayModInfo": "Exibir aviso quando os mods do servidor diferem do cliente", + "title.config.bclib.client.auto_sync.debugHashes": "Imprima-se-hashes de depuração de sincronização automática para registrar", + "title.config.bclib.generator.options.useOldBiomeGenerator": "Use Legacy 1.17 Biome Gerator", + "title.config.bclib.main.patches.applyPatches": "Aplique automaticamente patches ao carregar o nível", + "title.config.bclib.main.patches.repairBiomesOnLoad": "Corrija o Biomesource na carga nivelada", + "title.config.bclib.client.ui.suppressExperimentalDialogOnLoad": "Desative a tela de aviso experimental na carga", + "title.bclib.syncfiles.modInfo": "modInfo", + "title.bclib.syncfiles.modlist": "Informação mod", + "message.bclib.syncfiles.modlist": "A seguir, mostra o estado de seus mods instalados.\n\nTodos os mods que não existem localmente ou têm uma versão diferente no servidor serão sincronizados.", + "title.bclib.modmissmatch": "Conflito da versão mod", + "message.bclib.modmissmatch": "Alguns mods neste cliente não correspondem à versão dos mods no servidor.\n\nMods incompatíveis podem resultar em comportamento ou falha de jogo estranho.Por favor, faça Sue que você use os mesmos mods que o servidor.", + "message.bclib.datafixer.progress.waitbackup": "Esperando o backup terminar.Isso pode demorar um pouco!", + "message.bclib.datafixer.progress.reading": "Reading Data", + "message.bclib.datafixer.progress.players": "Consertando jogadores", + "message.bclib.datafixer.progress.level": "Aplicando patches ao nível.dat", + "message.bclib.datafixer.progress.worlddata": "Patching de dados mundiais personalizados", + "message.bclib.datafixer.progress.regions": "Reparando todas as regiões", + "message.bclib.datafixer.progress.saving": "Salvando o estado do patch", + "title.bclib.datafixer.progress": "fixingWorld", + "message.bclib.datafixer.progress": "Aplicando todos os patches ao seu mundo.", + "title.bclib.datafixer.error": "Erros enquanto corrige o mundo", + "message.bclib.datafixer.error": "Houve erros enquanto reparava o mundo.Isso significa que esse nível provavelmente está em um estado inconsistente e você não deve jogar.Restaure seu backup e corrija os erros abaixo antes de tentar novamente.", + "title.bclib.datafixer.error.continue": "Prossiga e marque como fixo", + "title.config.bclib.client.rendering.customFogRendering": "Renderização de nevoeiro personalizada", + "title.config.bclib.client.rendering.netherThickFog": "Nether de névoa espessa", + "title.config.bclib.main.infos.verbose": "Registro detalhado", + "title.config.bclib.client.infos.survives_on_hint": "Mostrar dica 'Sobrevive em' como dica de ferramenta", + "tooltip.bclib.place_on": "Sobrevive: %s", + "generator.bclib.normal": "BetterX", + "title.screen.bclib.worldgen.main": "Configurações mundiais do gerador", + "title.bclib.the_nether": "The Nether", + "title.bclib.the_end": "The End", + "title.screen.bclib.worldgen.custom_biome_source": "Use fonte de bioma personalizado", + "title.screen.bclib.worldgen.legacy_square": "Use mapa herdado (1.17)", + "title.screen.bclib.worldgen.custom_end_terrain": "Gerador de terreno final personalizado", + "title.screen.bclib.worldgen.avg_biome_size": "Tamanho médio do bioma (em pedaços)", + "title.screen.bclib.worldgen.other": "Other Settings", + "title.screen.bclib.worldgen.land_biome_size": "Biomas terrestres", + "title.screen.bclib.worldgen.void_biome_size": "Pequenos biomas da ilha", + "title.screen.bclib.worldgen.center_biome_size": "Biomas Centrais", + "title.screen.bclib.worldgen.barrens_biome_size": "barrens", + "title.screen.bclib.worldgen.central_radius": "Raio do vazio central (em pedaços)", + "title.screen.bclib.worldgen.end_void": "Gerar pequenas ilhas", + "bclib.updates.curseforge_link": "[CurseForge]", + "bclib.updates.title": "Moda atualizações", + "bclib.updates.disable_check": "Desative a verificação", + "bclib.updates.donate_pre": "Como nosso conteúdo?\nPor favor, considere uma pequena doação :)", + "bclib.updates.donate": "Doar", + "bclib.updates.description": "Alguns dos mods instalados estão desatualizados.Melhoramos e estendemos continuamente nosso conteúdo, bem como fornecemos importantes fixos de insetos.\nConsidere atualizar seus mods usando os links fornecidos abaixo.", + "bclib.welcome.title": "Bem-vindo ao ", + "bclib.welcome.description": "... E um enorme saudável ** Obrigado ** por baixar e reproduzir nossos mods.Esperamos que você os aprecie tanto quanto nós.\n\nAntes de começarmos, há algumas coisas que precisamos configurar; portanto, continue lendo a seguinte parte chata.", + "bclib.welcome.donation": "Se você gosta de nossos mods tanto quanto esperamos que faça, considere uma pequena doação :)", + "description.config.bclib.client.version.check": "O BCLIB inclui um verificador de versão simples que pode notificá -lo quando novas atualizações de nossos mods estiverem disponíveis.Para fazer isso, precisamos ler um recurso de um de nossos servidores da Web.Para processar a solicitação, juntamente com seu endereço IP (precisamos saber para onde enviar a resposta), também enviamos sua versão do Minecraft (para que possamos escolher a versão Mod certa).Os dados transmitidos nunca serão usados ou processados por nós para outros fins, mas devem ser armazenados em nossos arquivos de log por 4 semanas por razões legais.", + "title.config.bclib.client.version.check": "Habilitar Verificação da versão", + "title.config.bclib.client.ui.showUpdateInfo": "Permitir a tela de lembrete de atualização", + "title.config.bclib.client.rendering.FogDensity": "Densidade de nevoeiro", + "description.config.bclib.client.ui.suppressExperimentalDialogOnLoad": "A tela de aviso aparece sempre que seu mundo não usa as configurações da versão de baunilha.Isso pode acontecer quando você inicia um mundo em uma versão de visualização, mas também quando você usa mods para mudar a criação do mundo.Se essa opção estiver ativada, o aviso será ignorado quando você carregar um mundo existente.Ele ainda será exibido (como um lembrete) quando um novo mundo for criado.", + "title.config.bclib.client.ui.forceBetterXPreset": "Use melhorx como o tipo mundial padrão", + "warning.config.bclib.client.ui.forceBetterXPreset": "Provavelmente, você desejará manter esta opção ativada.\n", + "description.config.bclib.client.ui.forceBetterXPreset": "O tipo de mundo determina como um mundo é gerado.Na maioria dos casos, o melhorx deve ser mantido como padrão (você pode alterar o tipo a qualquer momento na tela de criação mundial).Esse tipo é otimizado para máxima compatibilidade entre os dados, nosso mod e outros mods de tecido.Ele também fornece alguns recursos exclusivos para melhor e melhor.Você só deve desativar essa opção se tiver um motivo para fazê -lo! ", + "emi.category.bclib.alloying": "Liga", + "emi.category.bclib.anvil_0": "Bigorna (Nível 0)", + "emi.category.bclib.anvil_1": "Bigorna (Nível I)", + "emi.category.bclib.anvil_2": "Bigorna (Nível II)", + "emi.category.bclib.anvil_3": "Bigorna (Nível III)", + "emi.category.bclib.anvil_4": "Bigorna (Nível IV)", + "emi.category.bclib.anvil_5": "Bigorna (Nível V)", + "tag.c.barrel": "Barris", + "tag.c.wooden_barrels": "Barris de madeira", + "tag.c.workbench": "Tabelas de criação", + "tag.c.furnaces": "Fornos", + "tag.c.saplings": "Mudas", + "tag.c.hammers": "Martelos", + "tag.c.leaves": "Folhas", + "tag.c.soul_ground": "Solo da Alma" + } \ No newline at end of file From b9bc3d9c2b037618e8cdc8cdf488ddb4014307be Mon Sep 17 00:00:00 2001 From: agnor99 Date: Mon, 31 Oct 2022 19:57:36 +0100 Subject: [PATCH 02/24] Update TagManager.java --- .../java/org/betterx/worlds/together/tag/v3/TagManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/betterx/worlds/together/tag/v3/TagManager.java b/src/main/java/org/betterx/worlds/together/tag/v3/TagManager.java index e547d9cb..f4030159 100644 --- a/src/main/java/org/betterx/worlds/together/tag/v3/TagManager.java +++ b/src/main/java/org/betterx/worlds/together/tag/v3/TagManager.java @@ -118,7 +118,7 @@ public class TagManager { public static boolean isToolWithMineableTag(ItemStack stack, TagKey tag) { if (stack.getItem() instanceof DiggerItemAccessor dig) { - return dig.bclib_getBlockTag().equals(tag); + return dig.bclib_getBlockTag() == tag; } return false; } From 5b99e0be53c99f264d0d96cb3b4b8beb29cc58da Mon Sep 17 00:00:00 2001 From: Frank Date: Sat, 12 Nov 2022 15:15:38 +0100 Subject: [PATCH 03/24] [Feature] New Bonemeal API --- .../api/v3/bonemeal/BonemealGrassLike.java | 103 ++++++++++++++++++ .../api/v3/bonemeal/BonemealNyliumLike.java | 52 +++++++++ .../api/v3/bonemeal/BonemealSpreader.java | 20 ++++ .../api/v3/bonemeal/EndStoneSpreader.java | 31 ++++++ .../api/v3/bonemeal/NetherrackSpreader.java | 81 ++++++++++++++ .../bclib/mixin/common/BoneMealItemMixin.java | 37 ++++++- .../together/tag/v3/CommonBlockTags.java | 5 + 7 files changed, 328 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealGrassLike.java create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealNyliumLike.java create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealSpreader.java create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/EndStoneSpreader.java create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/NetherrackSpreader.java diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealGrassLike.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealGrassLike.java new file mode 100644 index 00000000..36e2423d --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealGrassLike.java @@ -0,0 +1,103 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; + +import java.util.List; + +public interface BonemealGrassLike extends BonemealableBlock { + BlockState growableCoverState(); //Blocks.GRASS.defaultBlockState(); + Block hostBlock(); //this + + Holder coverFeature(); //VegetationPlacements.GRASS_BONEMEAL + List> flowerFeatures(); /*serverLevel.getBiome(currentPos) + .value() + .getGenerationSettings() + .getFlowerFeatures();*/ + + default boolean canGrowFlower(RandomSource random) { + return random.nextInt(8) == 0; + } + default boolean canGrowCover(RandomSource random) { + return random.nextInt(10) == 0; + } + + default boolean isValidBonemealTarget( + BlockGetter blockGetter, + BlockPos blockPos, + BlockState blockState, + boolean bl + ) { + return blockGetter.getBlockState(blockPos.above()).isAir(); + } + + default boolean isBonemealSuccess( + Level level, + RandomSource randomSource, + BlockPos blockPos, + BlockState blockState + ) { + return true; + } + + default void performBonemeal(ServerLevel serverLevel, RandomSource random, BlockPos pos, BlockState state) { + final BlockPos above = pos.above(); + final BlockState growableState = growableCoverState(); + + outerLoop: + for (int bonemealAttempt = 0; bonemealAttempt < 128; ++bonemealAttempt) { + BlockPos currentPos = above; + + for (int j = 0; j < bonemealAttempt / 16; ++j) { + currentPos = currentPos.offset( + random.nextInt(3) - 1, + (random.nextInt(3) - 1) * random.nextInt(3) / 2, + random.nextInt(3) - 1 + ); + if (!serverLevel.getBlockState(currentPos.below()).is(hostBlock()) + || serverLevel.getBlockState(currentPos) + .isCollisionShapeFullBlock(serverLevel, currentPos)) { + continue outerLoop; + } + } + + BlockState currentState = serverLevel.getBlockState(currentPos); + if (currentState.is(growableState.getBlock()) && canGrowCover(random)) { + ((BonemealableBlock) growableState.getBlock()).performBonemeal( + serverLevel, + random, + currentPos, + currentState + ); + } + + if (currentState.isAir()) { + Holder boneFeature; + if (canGrowFlower(random)) { + List> list = flowerFeatures(); + if (list.isEmpty()) { + continue; + } + + boneFeature = ((RandomPatchConfiguration) list.get(0).config()).feature(); + } else { + boneFeature = coverFeature(); + } + + boneFeature.value() + .place(serverLevel, serverLevel.getChunkSource().getGenerator(), random, currentPos); + } + } + + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealNyliumLike.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealNyliumLike.java new file mode 100644 index 00000000..bcbf4872 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealNyliumLike.java @@ -0,0 +1,52 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; + +public interface BonemealNyliumLike extends BonemealableBlock { + Block hostBlock(); //this + Holder coverFeature(); + + default boolean isValidBonemealTarget( + BlockGetter blockGetter, + BlockPos blockPos, + BlockState blockState, + boolean bl + ) { + return blockGetter.getBlockState(blockPos.above()).isAir(); + } + + default boolean isBonemealSuccess( + Level level, + RandomSource randomSource, + BlockPos blockPos, + BlockState blockState + ) { + return true; + } + + default void performBonemeal( + ServerLevel serverLevel, + RandomSource randomSource, + BlockPos blockPos, + BlockState blockState + ) { + final BlockState currentState = serverLevel.getBlockState(blockPos); + final BlockPos above = blockPos.above(); + final ChunkGenerator generator = serverLevel.getChunkSource().getGenerator(); + if (currentState.is(hostBlock())) { + coverFeature() + .value() + .place(serverLevel, generator, randomSource, above); + } + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealSpreader.java new file mode 100644 index 00000000..4b2a18b5 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealSpreader.java @@ -0,0 +1,20 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; + +public interface BonemealSpreader { + boolean isValidBonemealSpreadTarget(BlockGetter blockGetter, BlockPos blockPos, BlockState blockState, boolean bl); + + + boolean performBonemealSpread( + ServerLevel serverLevel, + RandomSource randomSource, + BlockPos blockPos, + BlockState blockState + ); + +} diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/EndStoneSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/EndStoneSpreader.java new file mode 100644 index 00000000..8f4a2517 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/EndStoneSpreader.java @@ -0,0 +1,31 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; + +public class EndStoneSpreader implements BonemealSpreader { + public static final EndStoneSpreader INSTANCE = new EndStoneSpreader(); + + @Override + public boolean isValidBonemealSpreadTarget( + BlockGetter blockGetter, + BlockPos blockPos, + BlockState blockState, + boolean bl + ) { + return false; + } + + @Override + public boolean performBonemealSpread( + ServerLevel serverLevel, + RandomSource randomSource, + BlockPos blockPos, + BlockState blockState + ) { + return false; + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/NetherrackSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/NetherrackSpreader.java new file mode 100644 index 00000000..86f42859 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/NetherrackSpreader.java @@ -0,0 +1,81 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import org.betterx.bclib.util.WeightedList; +import org.betterx.worlds.together.tag.v3.CommonBlockTags; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.HashMap; +import java.util.Map; + +public class NetherrackSpreader implements BonemealSpreader { + public static final NetherrackSpreader INSTANCE = new NetherrackSpreader(); + + public boolean isValidBonemealSpreadTarget( + BlockGetter blockGetter, + BlockPos blockPos, + BlockState blockState, + boolean bl + ) { + if (!blockGetter.getBlockState(blockPos.above()).propagatesSkylightDown(blockGetter, blockPos)) { + return false; + } else { + for (BlockPos testPos : BlockPos.betweenClosed( + blockPos.offset(-1, -1, -1), + blockPos.offset(1, 1, 1) + )) { + if (blockGetter.getBlockState(testPos).is(CommonBlockTags.NETHERRACK_SPREADABLE)) + return true; + } + return false; + } + } + + + public boolean performBonemealSpread( + ServerLevel serverLevel, + RandomSource randomSource, + BlockPos blockPos, + BlockState blockState + ) { + Map sourceBlocks = new HashMap<>(); + boolean hasNonVanilla = false; + for (BlockPos testPos : BlockPos.betweenClosed( + blockPos.offset(-1, -1, -1), + blockPos.offset(1, 1, 1) + )) { + BlockState state = serverLevel.getBlockState(testPos); + if (serverLevel.getBlockState(testPos).is(CommonBlockTags.NETHERRACK_SPREADABLE)) { + sourceBlocks.compute(state.getBlock(), (k, v) -> { + if (v == null) return 1; + return v + 1; + }); + } + + if (!state.is(Blocks.WARPED_NYLIUM) && state.is(Blocks.CRIMSON_NYLIUM)) { + hasNonVanilla = true; + } + } + + if (hasNonVanilla) { + WeightedList list = new WeightedList<>(); + for (Map.Entry e : sourceBlocks.entrySet()) { + list.add(e.getKey(), e.getValue()); + } + Block bl = list.get(randomSource); + if (bl != null) { + serverLevel.setBlock(blockPos, bl.defaultBlockState(), 3); + return true; + } + } + + + return false; + } +} diff --git a/src/main/java/org/betterx/bclib/mixin/common/BoneMealItemMixin.java b/src/main/java/org/betterx/bclib/mixin/common/BoneMealItemMixin.java index 9ed3f337..b858f1fb 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/BoneMealItemMixin.java @@ -2,14 +2,19 @@ package org.betterx.bclib.mixin.common; import org.betterx.bclib.api.v2.BonemealAPI; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; +import org.betterx.bclib.api.v3.bonemeal.BonemealSpreader; +import org.betterx.bclib.api.v3.bonemeal.EndStoneSpreader; +import org.betterx.bclib.api.v3.bonemeal.NetherrackSpreader; import org.betterx.bclib.util.BlocksHelper; import org.betterx.bclib.util.MHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Vec3i; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -33,7 +38,7 @@ public class BoneMealItemMixin { @Inject(method = "useOn", at = @At("HEAD"), cancellable = true) private void bclib_onUse(UseOnContext context, CallbackInfoReturnable info) { Level world = context.getLevel(); - BlockPos blockPos = context.getClickedPos(); + final BlockPos blockPos = context.getClickedPos(); if (!world.isClientSide()) { if (BonemealAPI.isTerrain(world.getBlockState(blockPos).getBlock())) { boolean consume = false; @@ -65,6 +70,36 @@ public class BoneMealItemMixin { } } + @Inject(method = "growCrop", at = @At("HEAD"), cancellable = true) + private static void growCrop( + ItemStack itemStack, + Level level, + BlockPos blockPos, + CallbackInfoReturnable cir + ) { + BlockState blockState = level.getBlockState(blockPos); + BonemealSpreader spreader = null; + + if (blockState.is(Blocks.NETHERRACK)) { + spreader = NetherrackSpreader.INSTANCE; + } else if (blockState.is(Blocks.END_STONE)) { + spreader = EndStoneSpreader.INSTANCE; + } else if (blockState.getBlock() instanceof BonemealSpreader s) { + spreader = s; + } + + if (spreader != null) { + if (spreader.isValidBonemealSpreadTarget(level, blockPos, blockState, level.isClientSide)) { + if (level instanceof ServerLevel) { + if (spreader.performBonemealSpread((ServerLevel) level, level.random, blockPos, blockState)) { + itemStack.shrink(1); + cir.setReturnValue(true); + } + } + } + } + } + @Unique private boolean bclib_growLandGrass(Level level, BlockPos pos) { int y1 = pos.getY() + 3; diff --git a/src/main/java/org/betterx/worlds/together/tag/v3/CommonBlockTags.java b/src/main/java/org/betterx/worlds/together/tag/v3/CommonBlockTags.java index 9f2ee4aa..81b1f2aa 100644 --- a/src/main/java/org/betterx/worlds/together/tag/v3/CommonBlockTags.java +++ b/src/main/java/org/betterx/worlds/together/tag/v3/CommonBlockTags.java @@ -35,7 +35,12 @@ public class CommonBlockTags { public static final TagKey TERRAIN = TagManager.BLOCKS.makeCommonTag("terrain"); public static final TagKey NETHER_TERRAIN = TagManager.BLOCKS.makeCommonTag("nether_terrain"); + public static final TagKey NETHERRACK_SPREADABLE = TagManager.BLOCKS.makeCommonTag( + "netherrack_spreadable"); + static void prepareTags() { + TagManager.BLOCKS.add(NETHERRACK_SPREADABLE, Blocks.WARPED_NYLIUM, Blocks.CRIMSON_NYLIUM); + TagManager.BLOCKS.add(SCULK_LIKE, Blocks.SCULK); TagManager.BLOCKS.addOtherTags(DRAGON_IMMUNE, BlockTags.DRAGON_IMMUNE); From 5faf0ef1348472a69ce0d1903cb2a9dc8cbca304 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 15 Nov 2022 16:30:34 +0100 Subject: [PATCH 04/24] More updates to new BoneMealAPI --- src/main/java/org/betterx/bclib/BCLib.java | 2 + .../org/betterx/bclib/api/v2/BonemealAPI.java | 19 +++ .../bclib/api/v3/bonemeal/BlockSpreader.java | 76 +++++++++ .../bclib/api/v3/bonemeal/BonemealAPI.java | 144 ++++++++++++++++++ ...reader.java => BonemealBlockSpreader.java} | 2 +- .../api/v3/bonemeal/BonemealGrassLike.java | 16 +- .../api/v3/bonemeal/BonemealNyliumLike.java | 22 +-- .../api/v3/bonemeal/EndStoneSpreader.java | 29 +--- .../api/v3/bonemeal/FeatureSpreader.java | 40 +++++ .../api/v3/bonemeal/NetherrackSpreader.java | 75 +-------- .../bonemeal/TaggedBonemealBlockSpreader.java | 23 +++ .../features/BCLConfigureFeature.java | 29 ++-- .../levelgen/features/BCLFeatureBuilder.java | 11 +- .../features/CommonPlacedFeatureBuilder.java | 7 + .../bclib/api/v3/tag/BCLBlockTags.java | 31 ++++ .../bclib/mixin/common/BoneMealItemMixin.java | 31 +--- .../together/tag/v3/CommonBlockTags.java | 5 - .../worlds/together/tag/v3/TagRegistry.java | 4 + 18 files changed, 411 insertions(+), 155 deletions(-) create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/BlockSpreader.java create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealAPI.java rename src/main/java/org/betterx/bclib/api/v3/bonemeal/{BonemealSpreader.java => BonemealBlockSpreader.java} (93%) create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/FeatureSpreader.java create mode 100644 src/main/java/org/betterx/bclib/api/v3/bonemeal/TaggedBonemealBlockSpreader.java create mode 100644 src/main/java/org/betterx/bclib/api/v3/tag/BCLBlockTags.java diff --git a/src/main/java/org/betterx/bclib/BCLib.java b/src/main/java/org/betterx/bclib/BCLib.java index de1bf196..50d2c4d7 100644 --- a/src/main/java/org/betterx/bclib/BCLib.java +++ b/src/main/java/org/betterx/bclib/BCLib.java @@ -15,6 +15,7 @@ import org.betterx.bclib.api.v2.levelgen.surface.rules.Conditions; import org.betterx.bclib.api.v2.poi.PoiManager; import org.betterx.bclib.api.v3.levelgen.features.blockpredicates.BlockPredicates; import org.betterx.bclib.api.v3.levelgen.features.placement.PlacementModifiers; +import org.betterx.bclib.api.v3.tag.BCLBlockTags; import org.betterx.bclib.commands.CommandRegistry; import org.betterx.bclib.config.Configs; import org.betterx.bclib.networking.VersionChecker; @@ -61,6 +62,7 @@ public class BCLib implements ModInitializer { AnvilRecipe.register(); Conditions.registerAll(); CommandRegistry.register(); + BCLBlockTags.ensureStaticallyLoaded(); PoiManager.registerAll(); DataExchangeAPI.registerDescriptors(List.of( diff --git a/src/main/java/org/betterx/bclib/api/v2/BonemealAPI.java b/src/main/java/org/betterx/bclib/api/v2/BonemealAPI.java index 3a18607c..e8470752 100644 --- a/src/main/java/org/betterx/bclib/api/v2/BonemealAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/BonemealAPI.java @@ -25,6 +25,7 @@ public class BonemealAPI { private static final Set TERRAIN_TO_SPREAD = Sets.newHashSet(); private static final Set TERRAIN = Sets.newHashSet(); + @Deprecated(forRemoval = true) public static void addSpreadableBlock(Block spreadableBlock, Block surfaceForSpread) { SPREADABLE_BLOCKS.put(spreadableBlock, surfaceForSpread); TERRAIN_TO_SPREAD.add(surfaceForSpread); @@ -35,38 +36,53 @@ public class BonemealAPI { return TERRAIN.contains(block); } + @Deprecated(forRemoval = true) public static boolean isSpreadableTerrain(Block block) { return TERRAIN_TO_SPREAD.contains(block); } + @Deprecated(forRemoval = true) public static Block getSpreadable(Block block) { return SPREADABLE_BLOCKS.get(block); } + @Deprecated(forRemoval = true) public static void addLandGrass(Block plant, Block... terrain) { addLandGrass(makeConsumer(plant), terrain); } + @Deprecated(forRemoval = true) public static void addLandGrass(BiConsumer plant, Block... terrain) { for (Block block : terrain) { addLandGrass(plant, block, 1F); } } + /** + * This API is deprecated, please use the new {@link org.betterx.bclib.api.v3.bonemeal.BonemealAPI}. + * + * @param biome + * @param plant + * @param terrain + */ + @Deprecated(forRemoval = true) public static void addLandGrass(ResourceLocation biome, Block plant, Block... terrain) { addLandGrass(biome, makeConsumer(plant), terrain); } + @Deprecated(forRemoval = true) public static void addLandGrass(ResourceLocation biome, BiConsumer plant, Block... terrain) { for (Block block : terrain) { addLandGrass(biome, plant, block, 1F); } } + @Deprecated(forRemoval = true) public static void addLandGrass(Block plant, Block terrain, float chance) { addLandGrass(makeConsumer(plant), terrain, chance); } + @Deprecated(forRemoval = true) public static void addLandGrass(BiConsumer plant, Block terrain, float chance) { WeightedList> list = LAND_GRASS_TYPES.get(terrain); if (list == null) { @@ -77,10 +93,12 @@ public class BonemealAPI { list.add(plant, chance); } + @Deprecated(forRemoval = true) public static void addLandGrass(ResourceLocation biome, Block plant, Block terrain, float chance) { addLandGrass(biome, makeConsumer(plant), terrain, chance); } + @Deprecated(forRemoval = true) public static void addLandGrass( ResourceLocation biome, BiConsumer plant, @@ -159,6 +177,7 @@ public class BonemealAPI { list.add(plant, chance); } + @Deprecated(forRemoval = true) public static BiConsumer getLandGrass( ResourceLocation biomeID, Block terrain, diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BlockSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BlockSpreader.java new file mode 100644 index 00000000..11609628 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BlockSpreader.java @@ -0,0 +1,76 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.util.random.SimpleWeightedRandomList; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.stateproviders.WeightedStateProvider; + +import java.util.HashMap; +import java.util.Map; + +abstract class BlockSpreader implements BonemealBlockSpreader { + protected abstract boolean isValidSource(BlockState state); + protected abstract boolean hasCustomBehaviour(BlockState state); + + public boolean isValidBonemealSpreadTarget( + BlockGetter blockGetter, + BlockPos blockPos, + BlockState blockState, + boolean bl + ) { + if (!blockGetter.getBlockState(blockPos.above()).propagatesSkylightDown(blockGetter, blockPos)) { + return false; + } else { + for (BlockPos testPos : BlockPos.betweenClosed( + blockPos.offset(-1, -1, -1), + blockPos.offset(1, 1, 1) + )) { + BlockState state = blockGetter.getBlockState(testPos); + if (isValidSource(state)) + if (hasCustomBehaviour(state)) + return true; + } + return false; + } + } + + public boolean performBonemealSpread( + ServerLevel serverLevel, + RandomSource randomSource, + BlockPos blockPos, + BlockState blockState + ) { + final Map sourceBlocks = new HashMap<>(); + + for (BlockPos testPos : BlockPos.betweenClosed( + blockPos.offset(-1, -1, -1), + blockPos.offset(1, 1, 1) + )) { + BlockState state = serverLevel.getBlockState(testPos); + if (isValidSource(state)) { + sourceBlocks.compute(state, (k, v) -> { + if (v == null) return 1; + return v + 1; + }); + } + } + + SimpleWeightedRandomList.Builder builder = new SimpleWeightedRandomList.Builder<>(); + for (Map.Entry e : sourceBlocks.entrySet()) { + builder.add(e.getKey(), e.getValue()); + } + WeightedStateProvider provider = new WeightedStateProvider(builder.build()); + + BlockState bl = provider.getState(randomSource, blockPos); + if (bl != null) { + serverLevel.setBlock(blockPos, bl, 3); + return true; + } + + + return false; + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealAPI.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealAPI.java new file mode 100644 index 00000000..ea7aac89 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealAPI.java @@ -0,0 +1,144 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature; +import org.betterx.bclib.api.v3.tag.BCLBlockTags; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; + +import java.util.HashMap; +import java.util.Map; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +public class BonemealAPI { + public static BonemealAPI INSTANCE = new BonemealAPI(); + private final Map, BonemealBlockSpreader> taggedSpreaders; + private final Map featureSpreaders; + + private BonemealAPI() { + taggedSpreaders = new HashMap<>(); + featureSpreaders = new HashMap<>(); + + addSpreadableBlocks(BCLBlockTags.BONEMEAL_TARGET_NETHERRACK, NetherrackSpreader.INSTANCE); + addSpreadableBlocks(BCLBlockTags.BONEMEAL_TARGET_END_STONE, EndStoneSpreader.INSTANCE); + } + + /** + * Bonemeal can be used to spread vegetation to neighbouring blocks. + *

+ * This method allows you to register a block (the type that was clicked with bonemeal) with + * a {@link BCLConfigureFeature} that will be placed on the bonemeald block + *

+ * You can achieve the same behaviour by implementing {@link BonemealNyliumLike} on your custom + * BlockClass. This is mainly intended for vanilla Blocks where you need to add bonemeal + * behaviour + * + * @param target The block-type + * @param spreadableFeature the feature to place + */ + public void addSpreadableFeatures( + Block target, + @NotNull BCLConfigureFeature, ?> spreadableFeature + ) { + featureSpreaders.put(target, new FeatureSpreader(target, spreadableFeature)); + } + + /** + * Bonemeal can be used to spread for example Nylium to Netherrack. + *

+ * In this example, Netherrack is the target block which will get replaced by one of the source blocks (like + * Warped or Crimson Nylium. You can register Tag-Combinations to easily add your own behaviour for custom + * blocks. + *

+ * When a Block with the Target-Tag + * + * @param targetTag If you click a Block with the given Tag using Bonemeal, you will replace it with + * a block from the sourceTag + * @param sourceTag Blocks with this Tag can replace the Target block if they are in a 3x3 Neighborhood + * centered around the target Block. + */ + public void addSpreadableBlocks(@NotNull TagKey targetTag, @NotNull TagKey sourceTag) { + taggedSpreaders.put(targetTag, new TaggedBonemealBlockSpreader(sourceTag)); + } + + /** + * See {@link #addSpreadableBlocks(TagKey, TagKey)} for Details. + * + * @param targetTag If you click a Block with the given Tag using Bonemeal, you will replace it with + * * a block from the sourceTag + * @param spreader The {@link BonemealBlockSpreader}-Object that is called when a corresponding target-Block + * is clicked with Bone-Meal + */ + public void addSpreadableBlocks(@NotNull TagKey targetTag, @NotNull BonemealBlockSpreader spreader) { + taggedSpreaders.put(targetTag, spreader); + } + + /** + * When a block is clicked with Bonemeal, this method will be called with the state of the given Block. + *

+ * If the Method returs a valid {@link BonemealBlockSpreader}-Instance, it will override the default behaviour + * for the BoneMeal, otherwise the vanilla action will be performed. + * + * @param state The {@link BlockState} you need to test + * @return A valid spreader instance, or {@code null} + */ + @ApiStatus.Internal + public BonemealBlockSpreader blockSpreaderForState(@NotNull BlockState state) { + for (var e : taggedSpreaders.entrySet()) { + if (state.is(e.getKey())) { + return e.getValue(); + } + } + + return null; + } + + @ApiStatus.Internal + public FeatureSpreader featureSpreaderForState(@NotNull BlockState state) { + return featureSpreaders.get(state.getBlock()); + } + + @ApiStatus.Internal + public boolean runSpreaders(ItemStack itemStack, Level level, BlockPos blockPos) { + BlockState blockState = level.getBlockState(blockPos); + BonemealBlockSpreader spreader = org.betterx.bclib.api.v3.bonemeal.BonemealAPI + .INSTANCE + .blockSpreaderForState(blockState); + + if (spreader != null) { + if (spreader.isValidBonemealSpreadTarget(level, blockPos, blockState, level.isClientSide)) { + if (level instanceof ServerLevel) { + if (spreader.performBonemealSpread((ServerLevel) level, level.random, blockPos, blockState)) { + itemStack.shrink(1); + } + } + return true; + } + } + + FeatureSpreader fSpreader = org.betterx.bclib.api.v3.bonemeal.BonemealAPI + .INSTANCE + .featureSpreaderForState(blockState); + + if (fSpreader != null) { + if (fSpreader.isValidBonemealTarget(level, blockPos, blockState, level.isClientSide)) { + if (level instanceof ServerLevel) { + if (fSpreader.isBonemealSuccess(level, level.random, blockPos, blockState)) { + fSpreader.performBonemeal((ServerLevel) level, level.random, blockPos, blockState); + } + itemStack.shrink(1); + } + return true; + } + } + + return false; + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealBlockSpreader.java similarity index 93% rename from src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealSpreader.java rename to src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealBlockSpreader.java index 4b2a18b5..49249cf0 100644 --- a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealSpreader.java +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealBlockSpreader.java @@ -6,7 +6,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.state.BlockState; -public interface BonemealSpreader { +public interface BonemealBlockSpreader { boolean isValidBonemealSpreadTarget(BlockGetter blockGetter, BlockPos blockPos, BlockState blockState, boolean bl); diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealGrassLike.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealGrassLike.java index 36e2423d..55d1321f 100644 --- a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealGrassLike.java +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealGrassLike.java @@ -16,11 +16,11 @@ import net.minecraft.world.level.levelgen.placement.PlacedFeature; import java.util.List; public interface BonemealGrassLike extends BonemealableBlock { - BlockState growableCoverState(); //Blocks.GRASS.defaultBlockState(); - Block hostBlock(); //this + BlockState getGrowableCoverState(); //Blocks.GRASS.defaultBlockState(); + Block getHostBlock(); //this - Holder coverFeature(); //VegetationPlacements.GRASS_BONEMEAL - List> flowerFeatures(); /*serverLevel.getBiome(currentPos) + Holder getCoverFeature(); //VegetationPlacements.GRASS_BONEMEAL + List> getFlowerFeatures(); /*serverLevel.getBiome(currentPos) .value() .getGenerationSettings() .getFlowerFeatures();*/ @@ -52,7 +52,7 @@ public interface BonemealGrassLike extends BonemealableBlock { default void performBonemeal(ServerLevel serverLevel, RandomSource random, BlockPos pos, BlockState state) { final BlockPos above = pos.above(); - final BlockState growableState = growableCoverState(); + final BlockState growableState = getGrowableCoverState(); outerLoop: for (int bonemealAttempt = 0; bonemealAttempt < 128; ++bonemealAttempt) { @@ -64,7 +64,7 @@ public interface BonemealGrassLike extends BonemealableBlock { (random.nextInt(3) - 1) * random.nextInt(3) / 2, random.nextInt(3) - 1 ); - if (!serverLevel.getBlockState(currentPos.below()).is(hostBlock()) + if (!serverLevel.getBlockState(currentPos.below()).is(getHostBlock()) || serverLevel.getBlockState(currentPos) .isCollisionShapeFullBlock(serverLevel, currentPos)) { continue outerLoop; @@ -84,14 +84,14 @@ public interface BonemealGrassLike extends BonemealableBlock { if (currentState.isAir()) { Holder boneFeature; if (canGrowFlower(random)) { - List> list = flowerFeatures(); + List> list = getFlowerFeatures(); if (list.isEmpty()) { continue; } boneFeature = ((RandomPatchConfiguration) list.get(0).config()).feature(); } else { - boneFeature = coverFeature(); + boneFeature = getCoverFeature(); } boneFeature.value() diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealNyliumLike.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealNyliumLike.java index bcbf4872..b6d7d8fa 100644 --- a/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealNyliumLike.java +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/BonemealNyliumLike.java @@ -1,7 +1,8 @@ package org.betterx.bclib.api.v3.bonemeal; +import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature; + import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockGetter; @@ -9,12 +10,12 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +//adapted from NyliumBlock public interface BonemealNyliumLike extends BonemealableBlock { - Block hostBlock(); //this - Holder coverFeature(); + Block getHostBlock(); //this + BCLConfigureFeature, ?> getCoverFeature(); default boolean isValidBonemealTarget( BlockGetter blockGetter, @@ -41,12 +42,11 @@ public interface BonemealNyliumLike extends BonemealableBlock { BlockState blockState ) { final BlockState currentState = serverLevel.getBlockState(blockPos); - final BlockPos above = blockPos.above(); - final ChunkGenerator generator = serverLevel.getChunkSource().getGenerator(); - if (currentState.is(hostBlock())) { - coverFeature() - .value() - .place(serverLevel, generator, randomSource, above); + if (currentState.is(getHostBlock())) { + BCLConfigureFeature, ?> feature = getCoverFeature(); + if (feature != null) { + feature.placeInWorld(serverLevel, blockPos.above(), randomSource, true); + } } } } diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/EndStoneSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/EndStoneSpreader.java index 8f4a2517..6d9ad02c 100644 --- a/src/main/java/org/betterx/bclib/api/v3/bonemeal/EndStoneSpreader.java +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/EndStoneSpreader.java @@ -1,31 +1,12 @@ package org.betterx.bclib.api.v3.bonemeal; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.state.BlockState; +import org.betterx.bclib.api.v3.tag.BCLBlockTags; -public class EndStoneSpreader implements BonemealSpreader { - public static final EndStoneSpreader INSTANCE = new EndStoneSpreader(); +public class EndStoneSpreader extends TaggedBonemealBlockSpreader { + static final EndStoneSpreader INSTANCE = new EndStoneSpreader(); - @Override - public boolean isValidBonemealSpreadTarget( - BlockGetter blockGetter, - BlockPos blockPos, - BlockState blockState, - boolean bl - ) { - return false; + protected EndStoneSpreader() { + super(BCLBlockTags.BONEMEAL_SOURCE_END_STONE); } - @Override - public boolean performBonemealSpread( - ServerLevel serverLevel, - RandomSource randomSource, - BlockPos blockPos, - BlockState blockState - ) { - return false; - } } diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/FeatureSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/FeatureSpreader.java new file mode 100644 index 00000000..8b433ac3 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/FeatureSpreader.java @@ -0,0 +1,40 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; + +public class FeatureSpreader implements BonemealNyliumLike { + public final BCLConfigureFeature, ?> spreadableFeature; + public final Block hostBlock; + + public FeatureSpreader(Block hostBlock, BCLConfigureFeature, ?> spreadableFeature) { + this.spreadableFeature = spreadableFeature; + this.hostBlock = hostBlock; + } + + @Override + public boolean isValidBonemealTarget( + BlockGetter blockGetter, + BlockPos blockPos, + BlockState blockState, + boolean bl + ) { + return spreadableFeature != null + && BonemealNyliumLike.super.isValidBonemealTarget(blockGetter, blockPos, blockState, bl); + } + + @Override + public Block getHostBlock() { + return hostBlock; + } + + @Override + public BCLConfigureFeature, ?> getCoverFeature() { + return spreadableFeature; + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/NetherrackSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/NetherrackSpreader.java index 86f42859..fd73bafa 100644 --- a/src/main/java/org/betterx/bclib/api/v3/bonemeal/NetherrackSpreader.java +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/NetherrackSpreader.java @@ -1,81 +1,18 @@ package org.betterx.bclib.api.v3.bonemeal; -import org.betterx.bclib.util.WeightedList; -import org.betterx.worlds.together.tag.v3.CommonBlockTags; +import org.betterx.bclib.api.v3.tag.BCLBlockTags; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import java.util.HashMap; -import java.util.Map; - -public class NetherrackSpreader implements BonemealSpreader { +public class NetherrackSpreader extends TaggedBonemealBlockSpreader { public static final NetherrackSpreader INSTANCE = new NetherrackSpreader(); - public boolean isValidBonemealSpreadTarget( - BlockGetter blockGetter, - BlockPos blockPos, - BlockState blockState, - boolean bl - ) { - if (!blockGetter.getBlockState(blockPos.above()).propagatesSkylightDown(blockGetter, blockPos)) { - return false; - } else { - for (BlockPos testPos : BlockPos.betweenClosed( - blockPos.offset(-1, -1, -1), - blockPos.offset(1, 1, 1) - )) { - if (blockGetter.getBlockState(testPos).is(CommonBlockTags.NETHERRACK_SPREADABLE)) - return true; - } - return false; - } + protected NetherrackSpreader() { + super(BCLBlockTags.BONEMEAL_SOURCE_NETHERRACK); } - - public boolean performBonemealSpread( - ServerLevel serverLevel, - RandomSource randomSource, - BlockPos blockPos, - BlockState blockState - ) { - Map sourceBlocks = new HashMap<>(); - boolean hasNonVanilla = false; - for (BlockPos testPos : BlockPos.betweenClosed( - blockPos.offset(-1, -1, -1), - blockPos.offset(1, 1, 1) - )) { - BlockState state = serverLevel.getBlockState(testPos); - if (serverLevel.getBlockState(testPos).is(CommonBlockTags.NETHERRACK_SPREADABLE)) { - sourceBlocks.compute(state.getBlock(), (k, v) -> { - if (v == null) return 1; - return v + 1; - }); - } - - if (!state.is(Blocks.WARPED_NYLIUM) && state.is(Blocks.CRIMSON_NYLIUM)) { - hasNonVanilla = true; - } - } - - if (hasNonVanilla) { - WeightedList list = new WeightedList<>(); - for (Map.Entry e : sourceBlocks.entrySet()) { - list.add(e.getKey(), e.getValue()); - } - Block bl = list.get(randomSource); - if (bl != null) { - serverLevel.setBlock(blockPos, bl.defaultBlockState(), 3); - return true; - } - } - - - return false; + protected boolean hasCustomBehaviour(BlockState state) { + return !state.is(Blocks.WARPED_NYLIUM) && !state.is(Blocks.CRIMSON_NYLIUM); } } diff --git a/src/main/java/org/betterx/bclib/api/v3/bonemeal/TaggedBonemealBlockSpreader.java b/src/main/java/org/betterx/bclib/api/v3/bonemeal/TaggedBonemealBlockSpreader.java new file mode 100644 index 00000000..6b0e5b29 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/bonemeal/TaggedBonemealBlockSpreader.java @@ -0,0 +1,23 @@ +package org.betterx.bclib.api.v3.bonemeal; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +class TaggedBonemealBlockSpreader extends BlockSpreader { + public final TagKey blockTag; + + public TaggedBonemealBlockSpreader(TagKey blockTag) { + this.blockTag = blockTag; + } + + @Override + protected boolean isValidSource(BlockState state) { + return state.is(blockTag); + } + + @Override + protected boolean hasCustomBehaviour(BlockState state) { + return true; + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLConfigureFeature.java b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLConfigureFeature.java index e3442c50..b5ad4fba 100644 --- a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLConfigureFeature.java +++ b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLConfigureFeature.java @@ -55,7 +55,11 @@ public class BCLConfigureFeature, FC extends FeatureConfig } public boolean placeInWorld(ServerLevel level, BlockPos pos, RandomSource random) { - return placeInWorld(getFeature(), getConfiguration(), level, pos, random); + return placeInWorld(level, pos, random, false); + } + + public boolean placeInWorld(ServerLevel level, BlockPos pos, RandomSource random, boolean unchanged) { + return placeUnboundInWorld(getFeature(), getConfiguration(), level, pos, random, unchanged); } private static boolean placeUnboundInWorld( @@ -63,16 +67,19 @@ public class BCLConfigureFeature, FC extends FeatureConfig FeatureConfiguration config, ServerLevel level, BlockPos pos, - RandomSource random + RandomSource random, + boolean asIs ) { - if (config instanceof RandomPatchConfiguration rnd) { - var configured = rnd.feature().value().feature().value(); - feature = configured.feature(); - config = configured.config(); - } + if (!asIs) { + if (config instanceof RandomPatchConfiguration rnd) { + var configured = rnd.feature().value().feature().value(); + feature = configured.feature(); + config = configured.config(); + } - if (feature instanceof UserGrowableFeature growable) { - return growable.grow(level, pos, random, config); + if (feature instanceof UserGrowableFeature growable) { + return growable.grow(level, pos, random, config); + } } FeaturePlaceContext context = new FeaturePlaceContext( @@ -92,7 +99,7 @@ public class BCLConfigureFeature, FC extends FeatureConfig BlockPos pos, RandomSource random ) { - return placeUnboundInWorld(feature, FeatureConfiguration.NONE, level, pos, random); + return placeUnboundInWorld(feature, FeatureConfiguration.NONE, level, pos, random, true); } public static boolean placeInWorld( @@ -102,6 +109,6 @@ public class BCLConfigureFeature, FC extends FeatureConfig BlockPos pos, RandomSource random ) { - return placeUnboundInWorld(feature, config, level, pos, random); + return placeUnboundInWorld(feature, config, level, pos, random, true); } } diff --git a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java index f5c8c048..dd53e5bf 100644 --- a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java +++ b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java @@ -140,6 +140,15 @@ public abstract class BCLFeatureBuilder, FC extends Featur ); } + public static NetherForrestVegetation startBonemealNetherVegetation( + ResourceLocation featureID + ) { + return new NetherForrestVegetation( + featureID, + (NetherForestVegetationFeature) Feature.NETHER_FOREST_VEGETATION + ).spreadHeight(1).spreadWidth(3); + } + public static WithTemplates startWithTemplates( ResourceLocation featureID @@ -671,7 +680,7 @@ public abstract class BCLFeatureBuilder, FC extends Featur // is meant to prevent that... if (NoneFeatureConfiguration.NONE != null) return (FC) NoneFeatureConfiguration.NONE; - + return (FC) NoneFeatureConfiguration.INSTANCE; } return configuration; diff --git a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/CommonPlacedFeatureBuilder.java b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/CommonPlacedFeatureBuilder.java index d26524db..781b0218 100644 --- a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/CommonPlacedFeatureBuilder.java +++ b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/CommonPlacedFeatureBuilder.java @@ -420,4 +420,11 @@ abstract class CommonPlacedFeatureBuilder, FC extends Feat public BCLFeatureBuilder.RandomPatch inRandomPatch(ResourceLocation id) { return BCLFeatureBuilder.startRandomPatch(id, build()); } + + public BCLFeatureBuilder.RandomPatch randomBonemealDistribution(ResourceLocation id) { + return inRandomPatch(id) + .tries(9) + .spreadXZ(3) + .spreadY(1); + } } diff --git a/src/main/java/org/betterx/bclib/api/v3/tag/BCLBlockTags.java b/src/main/java/org/betterx/bclib/api/v3/tag/BCLBlockTags.java new file mode 100644 index 00000000..ca638a64 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/tag/BCLBlockTags.java @@ -0,0 +1,31 @@ +package org.betterx.bclib.api.v3.tag; + +import org.betterx.worlds.together.tag.v3.TagManager; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; + +import org.jetbrains.annotations.ApiStatus; + +public class BCLBlockTags { + public static final TagKey BONEMEAL_SOURCE_NETHERRACK = TagManager.BLOCKS.makeTogetherTag( + "bonemeal/source/netherrack" + ); + public static final TagKey BONEMEAL_TARGET_NETHERRACK = TagManager.BLOCKS.makeTogetherTag( + "bonemeal/target/netherrack" + ); + public static final TagKey BONEMEAL_SOURCE_END_STONE = TagManager.BLOCKS.makeTogetherTag( + "bonemeal/source/end_stone" + ); + public static final TagKey BONEMEAL_TARGET_END_STONE = TagManager.BLOCKS.makeTogetherTag( + "bonemeal/target/end_stone" + ); + + @ApiStatus.Internal + public static void ensureStaticallyLoaded() { + TagManager.BLOCKS.add(BONEMEAL_SOURCE_NETHERRACK, Blocks.WARPED_NYLIUM, Blocks.CRIMSON_NYLIUM); + TagManager.BLOCKS.add(BONEMEAL_TARGET_NETHERRACK, Blocks.NETHERRACK); + TagManager.BLOCKS.add(BONEMEAL_TARGET_END_STONE, Blocks.END_STONE); + } +} diff --git a/src/main/java/org/betterx/bclib/mixin/common/BoneMealItemMixin.java b/src/main/java/org/betterx/bclib/mixin/common/BoneMealItemMixin.java index b858f1fb..f197bb94 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/BoneMealItemMixin.java @@ -2,16 +2,12 @@ package org.betterx.bclib.mixin.common; import org.betterx.bclib.api.v2.BonemealAPI; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; -import org.betterx.bclib.api.v3.bonemeal.BonemealSpreader; -import org.betterx.bclib.api.v3.bonemeal.EndStoneSpreader; -import org.betterx.bclib.api.v3.bonemeal.NetherrackSpreader; import org.betterx.bclib.util.BlocksHelper; import org.betterx.bclib.util.MHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Vec3i; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.BoneMealItem; import net.minecraft.world.item.ItemStack; @@ -71,32 +67,17 @@ public class BoneMealItemMixin { } @Inject(method = "growCrop", at = @At("HEAD"), cancellable = true) - private static void growCrop( + private static void bcl_growCrop( ItemStack itemStack, Level level, BlockPos blockPos, CallbackInfoReturnable cir ) { - BlockState blockState = level.getBlockState(blockPos); - BonemealSpreader spreader = null; - - if (blockState.is(Blocks.NETHERRACK)) { - spreader = NetherrackSpreader.INSTANCE; - } else if (blockState.is(Blocks.END_STONE)) { - spreader = EndStoneSpreader.INSTANCE; - } else if (blockState.getBlock() instanceof BonemealSpreader s) { - spreader = s; - } - - if (spreader != null) { - if (spreader.isValidBonemealSpreadTarget(level, blockPos, blockState, level.isClientSide)) { - if (level instanceof ServerLevel) { - if (spreader.performBonemealSpread((ServerLevel) level, level.random, blockPos, blockState)) { - itemStack.shrink(1); - cir.setReturnValue(true); - } - } - } + if (org.betterx.bclib.api.v3.bonemeal.BonemealAPI + .INSTANCE + .runSpreaders(itemStack, level, blockPos) + ) { + cir.setReturnValue(true); } } diff --git a/src/main/java/org/betterx/worlds/together/tag/v3/CommonBlockTags.java b/src/main/java/org/betterx/worlds/together/tag/v3/CommonBlockTags.java index 81b1f2aa..9f2ee4aa 100644 --- a/src/main/java/org/betterx/worlds/together/tag/v3/CommonBlockTags.java +++ b/src/main/java/org/betterx/worlds/together/tag/v3/CommonBlockTags.java @@ -35,12 +35,7 @@ public class CommonBlockTags { public static final TagKey TERRAIN = TagManager.BLOCKS.makeCommonTag("terrain"); public static final TagKey NETHER_TERRAIN = TagManager.BLOCKS.makeCommonTag("nether_terrain"); - public static final TagKey NETHERRACK_SPREADABLE = TagManager.BLOCKS.makeCommonTag( - "netherrack_spreadable"); - static void prepareTags() { - TagManager.BLOCKS.add(NETHERRACK_SPREADABLE, Blocks.WARPED_NYLIUM, Blocks.CRIMSON_NYLIUM); - TagManager.BLOCKS.add(SCULK_LIKE, Blocks.SCULK); TagManager.BLOCKS.addOtherTags(DRAGON_IMMUNE, BlockTags.DRAGON_IMMUNE); diff --git a/src/main/java/org/betterx/worlds/together/tag/v3/TagRegistry.java b/src/main/java/org/betterx/worlds/together/tag/v3/TagRegistry.java index 88f4b2bc..493626a0 100644 --- a/src/main/java/org/betterx/worlds/together/tag/v3/TagRegistry.java +++ b/src/main/java/org/betterx/worlds/together/tag/v3/TagRegistry.java @@ -205,6 +205,10 @@ public class TagRegistry { return creatTagKey(new ResourceLocation("c", name)); } + public TagKey makeTogetherTag(String name) { + return creatTagKey(WorldsTogether.makeID(name)); + } + public void addUntyped(TagKey tagID, ResourceLocation... elements) { if (isFrozen) WorldsTogether.LOGGER.warning("Adding Tag " + tagID + " after the API was frozen."); Set set = getSetForTag(tagID); From 81b6a464fd06bd3e412246770ef814a86157e4ce Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 15 Nov 2022 17:29:53 +0100 Subject: [PATCH 05/24] [Fixes] Tree growing would sometimes not destroy sapling (quiqueck/BetterNether#65) --- .../bclib/blocks/FeatureSaplingBlock.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/betterx/bclib/blocks/FeatureSaplingBlock.java b/src/main/java/org/betterx/bclib/blocks/FeatureSaplingBlock.java index 075d4736..1f25f68f 100644 --- a/src/main/java/org/betterx/bclib/blocks/FeatureSaplingBlock.java +++ b/src/main/java/org/betterx/bclib/blocks/FeatureSaplingBlock.java @@ -109,8 +109,37 @@ public class FeatureSaplingBlock, FC extends FeatureConfig @Override public void advanceTree(ServerLevel world, BlockPos pos, BlockState blockState, RandomSource random) { - BCLConfigureFeature conf = getConfiguredFeature(blockState); - conf.placeInWorld(world, pos, random); + if (blockState.getValue(STAGE) == 0) { + world.setBlock(pos, blockState.cycle(STAGE), 4); + } else { + BCLConfigureFeature conf = getConfiguredFeature(blockState); + growFeature(conf, world, pos, blockState, random); + } + } + + protected boolean growFeature( + BCLConfigureFeature feature, + ServerLevel serverLevel, + BlockPos blockPos, + BlockState originalBlockState, + RandomSource randomSource + ) { + if (feature == null) { + return false; + } else { + BlockState emptyState = serverLevel.getFluidState(blockPos).createLegacyBlock(); + serverLevel.setBlock(blockPos, emptyState, 4); + if (feature.placeInWorld(serverLevel, blockPos, randomSource)) { + if (serverLevel.getBlockState(blockPos) == emptyState) { + serverLevel.sendBlockUpdated(blockPos, originalBlockState, emptyState, 2); + } + + return true; + } else { + serverLevel.setBlock(blockPos, originalBlockState, 4); + return false; + } + } } @Override From 1c857518b87eb5604e05870f04006e3bd3357eb5 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 15 Nov 2022 19:09:44 +0100 Subject: [PATCH 06/24] [Changes] EquipmentSets take values for attack-speed and -damage --- .../bclib/items/complex/EquipmentSet.java | 105 +++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java index a0872575..890ce64a 100644 --- a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java +++ b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java @@ -9,9 +9,79 @@ import net.minecraft.world.level.ItemLike; import java.util.HashMap; import java.util.Map; +import java.util.function.Function; import org.jetbrains.annotations.NotNull; public abstract class EquipmentSet { + public static class AttackDamage { + public static SetValues IRON_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, 3) + .add(EquipmentSet.AXE_SLOT, 6) + .add(EquipmentSet.SHOVEL_SLOT, 1.5f) + .add(EquipmentSet.PICKAXE_SLOT, 1) + .add(EquipmentSet.HOE_SLOT, -2); + + public static SetValues DIAMOND_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, 3) + .add(EquipmentSet.AXE_SLOT, 5) + .add(EquipmentSet.SHOVEL_SLOT, 1.5f) + .add(EquipmentSet.PICKAXE_SLOT, 1) + .add(EquipmentSet.HOE_SLOT, -3); + } + + public static class AttackSpeed { + public static SetValues IRON_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, -2.4f) + .add(EquipmentSet.AXE_SLOT, -3.1f) + .add(EquipmentSet.SHOVEL_SLOT, -3.0f) + .add(EquipmentSet.PICKAXE_SLOT, -2.8f) + .add(EquipmentSet.HOE_SLOT, -1.0f); + + public static SetValues DIAMOND_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, -2.4f) + .add(EquipmentSet.AXE_SLOT, -3.0f) + .add(EquipmentSet.SHOVEL_SLOT, -3.0f) + .add(EquipmentSet.PICKAXE_SLOT, -2.8f) + .add(EquipmentSet.HOE_SLOT, 0.0f); + } + + public interface ItemDescriptorCreator { + EquipmentDescription build(Item base, Function creator); + } + + public interface DescriptorCreator { + EquipmentDescription build(Function creator); + } + + public interface ItemCreator { + I build(Tier t, float attackDamage, float attackSpeed); + } + + public static class SetValues { + private final Map values; + + private SetValues() { + values = new HashMap<>(); + } + + public static SetValues create() { + return new SetValues(); + } + + public SetValues add(String slot, float value) { + values.put(slot, value); + return this; + } + + public float get(String slot) { + return values.getOrDefault(slot, 0.0f); + } + } + public final Tier material; public final String baseName; public final String modID; @@ -28,19 +98,52 @@ public abstract class EquipmentSet { public static final String LEGGINGS_SLOT = "leggings"; public static final String BOOTS_SLOT = "boots"; + public final SetValues attackDamage; + public final SetValues attackSpeed; + private final Map> descriptions = new HashMap<>(); - public EquipmentSet(Tier material, String modID, String baseName, ItemLike stick) { + public EquipmentSet( + Tier material, + String modID, + String baseName, + ItemLike stick, + SetValues attackDamage, + SetValues attackSpeed + ) { this.material = material; this.baseName = baseName; this.modID = modID; this.stick = stick; + this.attackDamage = attackDamage; + this.attackSpeed = attackSpeed; } protected void add(String slot, EquipmentDescription desc) { descriptions.put(slot, desc); } + protected void add( + String slot, + EquipmentSet baseSet, + ItemDescriptorCreator descriptor, + ItemCreator item + ) { + EquipmentDescription desc = descriptor.build( + baseSet.getSlot(slot), + (tier) -> item.build(tier, this.attackDamage.get(slot), this.attackSpeed.get(slot)) + ); + descriptions.put(slot, desc); + } + + protected void add(String slot, DescriptorCreator descriptor, ItemCreator item) { + EquipmentDescription desc = descriptor.build( + (tier) -> item.build(tier, this.attackDamage.get(slot), this.attackSpeed.get(slot)) + ); + descriptions.put(slot, desc); + } + + public EquipmentSet init(ItemRegistry itemsRegistry) { for (var desc : descriptions.entrySet()) { desc.getValue() From bf60049ed9d1fe1f66bc9094cdfe7c716a402c1c Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 15 Nov 2022 19:29:08 +0100 Subject: [PATCH 07/24] Additional Slot Values --- .../bclib/items/complex/EquipmentSet.java | 64 +++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java index 890ce64a..178ae26f 100644 --- a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java +++ b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java @@ -14,39 +14,95 @@ import org.jetbrains.annotations.NotNull; public abstract class EquipmentSet { public static class AttackDamage { + public static SetValues WOOD_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, 3) + .add(EquipmentSet.SHOVEL_SLOT, 1.5f) + .add(EquipmentSet.PICKAXE_SLOT, 1) + .add(EquipmentSet.AXE_SLOT, 6) + .add(EquipmentSet.HOE_SLOT, 0); + + public static SetValues STONE_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, 3) + .add(EquipmentSet.SHOVEL_SLOT, 1.5f) + .add(EquipmentSet.PICKAXE_SLOT, 1) + .add(EquipmentSet.AXE_SLOT, 7) + .add(EquipmentSet.HOE_SLOT, -1); + + public static SetValues GOLDEN_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, 3) + .add(EquipmentSet.SHOVEL_SLOT, 1.5f) + .add(EquipmentSet.PICKAXE_SLOT, 1) + .add(EquipmentSet.AXE_SLOT, 6) + .add(EquipmentSet.HOE_SLOT, 0); public static SetValues IRON_LEVEL = EquipmentSet.SetValues .create() .add(EquipmentSet.SWORD_SLOT, 3) - .add(EquipmentSet.AXE_SLOT, 6) .add(EquipmentSet.SHOVEL_SLOT, 1.5f) .add(EquipmentSet.PICKAXE_SLOT, 1) + .add(EquipmentSet.AXE_SLOT, 6) .add(EquipmentSet.HOE_SLOT, -2); public static SetValues DIAMOND_LEVEL = EquipmentSet.SetValues .create() .add(EquipmentSet.SWORD_SLOT, 3) - .add(EquipmentSet.AXE_SLOT, 5) .add(EquipmentSet.SHOVEL_SLOT, 1.5f) .add(EquipmentSet.PICKAXE_SLOT, 1) + .add(EquipmentSet.AXE_SLOT, 5) .add(EquipmentSet.HOE_SLOT, -3); + + public static SetValues NETHERITE_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, 3) + .add(EquipmentSet.SHOVEL_SLOT, 1.5f) + .add(EquipmentSet.PICKAXE_SLOT, 1) + .add(EquipmentSet.AXE_SLOT, 5) + .add(EquipmentSet.HOE_SLOT, -4); } public static class AttackSpeed { + public static SetValues WOOD_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, -2.4f) + .add(EquipmentSet.SHOVEL_SLOT, -3.0f) + .add(EquipmentSet.PICKAXE_SLOT, -2.8f) + .add(EquipmentSet.AXE_SLOT, -3.2f) + .add(EquipmentSet.HOE_SLOT, -3.0f); + + public static SetValues STONE_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, -2.4f) + .add(EquipmentSet.SHOVEL_SLOT, -3.0f) + .add(EquipmentSet.PICKAXE_SLOT, -2.8f) + .add(EquipmentSet.AXE_SLOT, -3.2f) + .add(EquipmentSet.HOE_SLOT, -2.0f); + + public static SetValues GOLDEN_LEVEL = EquipmentSet.SetValues + .create() + .add(EquipmentSet.SWORD_SLOT, -2.4f) + .add(EquipmentSet.SHOVEL_SLOT, -3.0f) + .add(EquipmentSet.PICKAXE_SLOT, -2.8f) + .add(EquipmentSet.AXE_SLOT, -3.0f) + .add(EquipmentSet.HOE_SLOT, -3.0f); public static SetValues IRON_LEVEL = EquipmentSet.SetValues .create() .add(EquipmentSet.SWORD_SLOT, -2.4f) - .add(EquipmentSet.AXE_SLOT, -3.1f) .add(EquipmentSet.SHOVEL_SLOT, -3.0f) .add(EquipmentSet.PICKAXE_SLOT, -2.8f) + .add(EquipmentSet.AXE_SLOT, -3.1f) .add(EquipmentSet.HOE_SLOT, -1.0f); public static SetValues DIAMOND_LEVEL = EquipmentSet.SetValues .create() .add(EquipmentSet.SWORD_SLOT, -2.4f) - .add(EquipmentSet.AXE_SLOT, -3.0f) .add(EquipmentSet.SHOVEL_SLOT, -3.0f) .add(EquipmentSet.PICKAXE_SLOT, -2.8f) + .add(EquipmentSet.AXE_SLOT, -3.0f) .add(EquipmentSet.HOE_SLOT, 0.0f); + + public static SetValues NETHERITE_LEVEL = DIAMOND_LEVEL; } public interface ItemDescriptorCreator { From 09f2a9148c146ea6b4e2792fa6ee80fdb5cd6481 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 15 Nov 2022 19:36:37 +0100 Subject: [PATCH 08/24] Create a copied set --- .../betterx/bclib/items/complex/EquipmentSet.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java index 178ae26f..70474788 100644 --- a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java +++ b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java @@ -128,11 +128,23 @@ public abstract class EquipmentSet { return new SetValues(); } + public static SetValues copy(SetValues source, float offset) { + SetValues v = create(); + for (var e : source.values.entrySet()) + v.add(e.getKey(), e.getValue() + offset); + return v; + } + public SetValues add(String slot, float value) { values.put(slot, value); return this; } + public SetValues offset(String slot, float offset) { + values.put(slot, get(slot) + offset); + return this; + } + public float get(String slot) { return values.getOrDefault(slot, 0.0f); } From 1f91c0edda2be2717d424c969c9cb4e331146f7c Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 15 Nov 2022 20:41:49 +0100 Subject: [PATCH 09/24] Added Backward Compatible Constructor --- .../org/betterx/bclib/items/complex/EquipmentSet.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java index 70474788..71eded7e 100644 --- a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java +++ b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java @@ -171,6 +171,16 @@ public abstract class EquipmentSet { private final Map> descriptions = new HashMap<>(); + @Deprecated(forRemoval = true) + public EquipmentSet( + Tier material, + String modID, + String baseName, + ItemLike stick + ) { + this(material, modID, baseName, stick, AttackDamage.IRON_LEVEL, AttackSpeed.IRON_LEVEL); + } + public EquipmentSet( Tier material, String modID, From 42be3dd2c7e4c5e7f8b8cf03934c851c1d085ad6 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 10:09:21 +0100 Subject: [PATCH 10/24] [Feature] New WorldTypes for BetterX + Large Biomes (`bclib:large`)Overworld or Amplified (`bclib:amplified`) Overworld (#53) --- .../config/BCLEndBiomeSourceConfig.java | 22 ++++++++++ .../config/BCLNetherBiomeSourceConfig.java | 15 +++++++ .../bclib/registry/PresetsRegistry.java | 44 ++++++++++++++++++- .../bclib/registry/PresetsRegistryClient.java | 14 ++++++ .../common/WorldPresetsBootstrapMixin.java | 20 ++++++++- .../together/worldPreset/WorldPresets.java | 21 +++++++-- .../resources/assets/bclib/lang/de_de.json | 2 + .../resources/assets/bclib/lang/en_us.json | 2 + 8 files changed, 134 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLEndBiomeSourceConfig.java b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLEndBiomeSourceConfig.java index 0a76e88d..177ac98c 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLEndBiomeSourceConfig.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLEndBiomeSourceConfig.java @@ -45,6 +45,28 @@ public class BCLEndBiomeSourceConfig implements BiomeSourceConfig CODEC = RecordCodecBuilder.create(instance -> instance diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java index 4d8c5249..ac892e4f 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java @@ -32,6 +32,21 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig CODEC = RecordCodecBuilder.create(instance -> instance diff --git a/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java b/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java index 3cd61b77..c47a4e77 100644 --- a/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java +++ b/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java @@ -10,21 +10,25 @@ import org.betterx.worlds.together.levelgen.WorldGenUtil; import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; import org.betterx.worlds.together.worldPreset.WorldPresets; +import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.presets.WorldPreset; import java.util.Map; public class PresetsRegistry implements WorldPresetBootstrap { public static ResourceKey BCL_WORLD; + public static ResourceKey BCL_WORLD_LARGE; + public static ResourceKey BCL_WORLD_AMPLIFIED; public static ResourceKey BCL_WORLD_17; public void bootstrapWorldPresets() { BCL_WORLD = WorldPresets.register( BCLib.makeID("normal"), - (overworldStem, netherContext, endContext) -> + (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> buildPreset( overworldStem, netherContext, @@ -34,9 +38,45 @@ public class PresetsRegistry implements WorldPresetBootstrap { true ); + BCL_WORLD_LARGE = + WorldPresets.register( + BCLib.makeID("large"), + (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { + Holder largeBiomeGenerator = noiseSettings + .getOrCreateHolderOrThrow(NoiseGeneratorSettings.LARGE_BIOMES); + return buildPreset( + noiseBasedOverworld.make( + overworldStem.generator().getBiomeSource(), + largeBiomeGenerator + ), + netherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_LARGE, + endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_LARGE + ); + }, + true + ); + + BCL_WORLD_AMPLIFIED = + WorldPresets.register( + BCLib.makeID("amplified"), + (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { + Holder largeBiomeGenerator = noiseSettings + .getOrCreateHolderOrThrow(NoiseGeneratorSettings.AMPLIFIED); + return buildPreset( + noiseBasedOverworld.make( + overworldStem.generator().getBiomeSource(), + largeBiomeGenerator + ), + netherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED, + endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED + ); + }, + true + ); + BCL_WORLD_17 = WorldPresets.register( BCLib.makeID("legacy_17"), - (overworldStem, netherContext, endContext) -> + (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> buildPreset( overworldStem, netherContext, diff --git a/src/main/java/org/betterx/bclib/registry/PresetsRegistryClient.java b/src/main/java/org/betterx/bclib/registry/PresetsRegistryClient.java index be28feb3..f2a9e9e3 100644 --- a/src/main/java/org/betterx/bclib/registry/PresetsRegistryClient.java +++ b/src/main/java/org/betterx/bclib/registry/PresetsRegistryClient.java @@ -12,5 +12,19 @@ public class PresetsRegistryClient { WorldPresetsClient.registerCustomizeUI(PresetsRegistry.BCL_WORLD, (createWorldScreen, worldCreationContext) -> { return new WorldSetupScreen(createWorldScreen, worldCreationContext); }); + + WorldPresetsClient.registerCustomizeUI( + PresetsRegistry.BCL_WORLD_LARGE, + (createWorldScreen, worldCreationContext) -> { + return new WorldSetupScreen(createWorldScreen, worldCreationContext); + } + ); + + WorldPresetsClient.registerCustomizeUI( + PresetsRegistry.BCL_WORLD_AMPLIFIED, + (createWorldScreen, worldCreationContext) -> { + return new WorldSetupScreen(createWorldScreen, worldCreationContext); + } + ); } } diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetsBootstrapMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetsBootstrapMixin.java index 0d1cd6a0..763fd4ab 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetsBootstrapMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetsBootstrapMixin.java @@ -6,6 +6,7 @@ import org.betterx.worlds.together.worldPreset.WorldPresets; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; @@ -48,6 +49,16 @@ public abstract class WorldPresetsBootstrapMixin { //see WorldPresets.register + @Shadow + protected abstract LevelStem makeNoiseBasedOverworld( + BiomeSource biomeSource, + Holder holder + ); + + @Shadow + @Final + private Registry noiseSettings; + @ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;")) private LevelStem bcl_getOverworldStem(LevelStem overworldStem) { WorldGenUtil.Context netherContext = new WorldGenUtil.Context( @@ -65,7 +76,14 @@ public abstract class WorldPresetsBootstrapMixin { this.endNoiseSettings ); - WorldPresets.bootstrapPresets(presets, overworldStem, netherContext, endContext); + WorldPresets.bootstrapPresets( + presets, + overworldStem, + netherContext, + endContext, + noiseSettings, + this::makeNoiseBasedOverworld + ); return overworldStem; } diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/WorldPresets.java b/src/main/java/org/betterx/worlds/together/worldPreset/WorldPresets.java index a77273f7..3d7bf3b3 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/WorldPresets.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/WorldPresets.java @@ -15,7 +15,9 @@ import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.WorldPresetTags; +import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.presets.WorldPreset; import com.google.common.collect.Maps; @@ -24,6 +26,10 @@ import java.util.Map; import org.jetbrains.annotations.ApiStatus; public class WorldPresets { + @FunctionalInterface + public interface OverworldBuilder { + LevelStem make(BiomeSource biomeSource, Holder noiseGeneratorSettings); + } public static final TagRegistry.Simple WORLD_PRESETS = TagManager.registerType(BuiltinRegistries.WORLD_PRESET, "tags/worldgen/world_preset"); @@ -78,17 +84,24 @@ public class WorldPresets { return key; } + @ApiStatus.Internal public static void bootstrapPresets( Registry presets, LevelStem overworldStem, WorldGenUtil.Context netherContext, - WorldGenUtil.Context endContext + WorldGenUtil.Context endContext, + Registry noiseSettings, + OverworldBuilder noiseBasedOverworld ) { EntrypointUtil.getCommon(WorldPresetBootstrap.class) .forEach(e -> e.bootstrapWorldPresets()); for (Map.Entry, PresetBuilder> e : BUILDERS.entrySet()) { - TogetherWorldPreset preset = e.getValue().create(overworldStem, netherContext, endContext); + TogetherWorldPreset preset = e.getValue() + .create( + overworldStem, netherContext, endContext, + noiseSettings, noiseBasedOverworld + ); BuiltinRegistries.register(presets, e.getKey(), preset); } BUILDERS = null; @@ -112,7 +125,9 @@ public class WorldPresets { TogetherWorldPreset create( LevelStem overworldStem, WorldGenUtil.Context netherContext, - WorldGenUtil.Context endContext + WorldGenUtil.Context endContext, + Registry noiseSettings, + OverworldBuilder noiseBasedOverworld ); } } diff --git a/src/main/resources/assets/bclib/lang/de_de.json b/src/main/resources/assets/bclib/lang/de_de.json index 2378a3b9..a0894018 100644 --- a/src/main/resources/assets/bclib/lang/de_de.json +++ b/src/main/resources/assets/bclib/lang/de_de.json @@ -50,6 +50,8 @@ "title.bclib.datafixer.error.continue": "Continue and Mark as Fixed", "tooltip.bclib.place_on": "Lebt auf: %s", "generator.bclib.normal": "BetterX", + "generator.bclib.large": "Groß & BetterX", + "generator.bclib.amplified": "Ampl. & BetterX", "title.screen.bclib.worldgen.main": "Welt-Generator Eigenschaften", "title.bclib.the_nether": "Nether", "title.bclib.the_end": "Das Ende", diff --git a/src/main/resources/assets/bclib/lang/en_us.json b/src/main/resources/assets/bclib/lang/en_us.json index 79ba425f..711c1215 100644 --- a/src/main/resources/assets/bclib/lang/en_us.json +++ b/src/main/resources/assets/bclib/lang/en_us.json @@ -54,6 +54,8 @@ "title.config.bclib.client.infos.survives_on_hint": "Show 'Survives On' hint as Tooltip", "tooltip.bclib.place_on": "Survives on: %s", "generator.bclib.normal": "BetterX", + "generator.bclib.large": "Large & BetterX", + "generator.bclib.amplified": "Ampl. & BetterX", "title.screen.bclib.worldgen.main": "World Generator Settings", "title.bclib.the_nether": "The Nether", "title.bclib.the_end": "The End", From 1e968fafc7b4bd6f4789578514a7f05aa62193c5 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 10:26:31 +0100 Subject: [PATCH 11/24] [Feature] Additional UI Config Options for Nether BiomeSource on the Customize World Screen (quiqueck/BetterNether#62) --- .../config/BCLNetherBiomeSourceConfig.java | 3 ++ .../client/gui/screens/WorldSetupScreen.java | 44 +++++++++++++++++-- .../resources/assets/bclib/lang/de_de.json | 3 ++ .../resources/assets/bclib/lang/en_us.json | 3 ++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java index ac892e4f..41cc5a91 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java @@ -86,6 +86,9 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig { netherLegacy.setEnabled(state); + netherVertical.setEnabled(state); + netherBiomeSize.setEnabled(state); + netherVerticalBiomeSize.setEnabled(state && netherVertical.isChecked()); + }); + + netherVertical.onChange((cb, state) -> { + netherVerticalBiomeSize.setEnabled(state && bclibNether.isChecked()); }); content.addSpacer(8); @@ -231,9 +269,9 @@ public class WorldSetupScreen extends LayoutScreen { netherLegacy.isChecked() ? BCLNetherBiomeSourceConfig.NetherBiomeMapType.SQUARE : BCLNetherBiomeSourceConfig.NetherBiomeMapType.HEX, - BCLNetherBiomeSourceConfig.DEFAULT.biomeSize, - BCLNetherBiomeSourceConfig.DEFAULT.biomeSizeVertical, - BCLNetherBiomeSourceConfig.DEFAULT.useVerticalBiomes + netherBiomeSize.getValue() * 16, + netherVerticalBiomeSize.getValue() * 16, + netherVertical.isChecked() ); ChunkGenerator netherGenerator = betterxDimensions.get(LevelStem.NETHER); diff --git a/src/main/resources/assets/bclib/lang/de_de.json b/src/main/resources/assets/bclib/lang/de_de.json index a0894018..57362d0c 100644 --- a/src/main/resources/assets/bclib/lang/de_de.json +++ b/src/main/resources/assets/bclib/lang/de_de.json @@ -61,6 +61,9 @@ "title.screen.bclib.worldgen.end_void": "Kleine End-Inseln erzeugen", "title.screen.bclib.worldgen.avg_biome_size": "Durchschnittl. Biome Größe (in Chunks)", "title.screen.bclib.worldgen.other": "Sonstiges", + "title.screen.bclib.worldgen.nether_biome_size": "Größe", + "title.screen.bclib.worldgen.nether_vertical_biome_size": "Biomhöhe", + "title.screen.bclib.worldgen.nether_vertical": "Biome auch vertikal verteilen", "title.screen.bclib.worldgen.land_biome_size": "Land-Biome", "title.screen.bclib.worldgen.void_biome_size": "Kleine Inseln", "title.screen.bclib.worldgen.center_biome_size": "Zentralbiome", diff --git a/src/main/resources/assets/bclib/lang/en_us.json b/src/main/resources/assets/bclib/lang/en_us.json index 711c1215..d3d35f7e 100644 --- a/src/main/resources/assets/bclib/lang/en_us.json +++ b/src/main/resources/assets/bclib/lang/en_us.json @@ -64,6 +64,9 @@ "title.screen.bclib.worldgen.custom_end_terrain": "Custom End Terrain Generator", "title.screen.bclib.worldgen.avg_biome_size": "Average Biome Size (in Chunks)", "title.screen.bclib.worldgen.other": "Other Settings", + "title.screen.bclib.worldgen.nether_biome_size": "Biome Size", + "title.screen.bclib.worldgen.nether_vertical_biome_size": "Biome Height", + "title.screen.bclib.worldgen.nether_vertical": "Generate vertical Biomes", "title.screen.bclib.worldgen.land_biome_size": "Land Biomes", "title.screen.bclib.worldgen.void_biome_size": "Small Island Biomes", "title.screen.bclib.worldgen.center_biome_size": "Central Biomes", From 172737e0faeac5f53c10f23322115284a265ccd9 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 12:03:07 +0100 Subject: [PATCH 12/24] [Feature] Double Height Nether (for amplified worlds) --- .../api/v2/generator/BCLChunkGenerator.java | 34 +++++++++++-- .../config/BCLNetherBiomeSourceConfig.java | 25 +++++++--- .../client/gui/screens/WorldSetupScreen.java | 19 ++++++- .../common/NoiseGeneratorSettingsMixin.java | 36 ++++++++++++++ .../bclib/registry/PresetsRegistry.java | 49 +++++++++++-------- .../resources/assets/bclib/lang/de_de.json | 1 + .../resources/assets/bclib/lang/en_us.json | 1 + src/main/resources/bclib.accesswidener | 4 +- 8 files changed, 135 insertions(+), 34 deletions(-) create mode 100644 src/main/java/org/betterx/bclib/mixin/common/NoiseGeneratorSettingsMixin.java diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BCLChunkGenerator.java b/src/main/java/org/betterx/bclib/api/v2/generator/BCLChunkGenerator.java index 39114b70..0d4a5ca6 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BCLChunkGenerator.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BCLChunkGenerator.java @@ -17,6 +17,8 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.data.worldgen.SurfaceRuleData; import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; @@ -24,13 +26,11 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.FeatureSorter; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; -import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -import net.minecraft.world.level.levelgen.RandomState; -import net.minecraft.world.level.levelgen.WorldGenSettings; +import net.minecraft.world.level.levelgen.*; import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.synth.NormalNoise; @@ -63,6 +63,12 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto .and(builderInstance.group(noiseGetter, biomeSourceCodec, settingsCodec)) .apply(builderInstance, builderInstance.stable(BCLChunkGenerator::new)); }); + protected static final NoiseSettings NETHER_NOISE_SETTINGS_AMPLIFIED = NoiseSettings.create(0, 256, 1, 4); + public static final ResourceKey AMPLIFIED_NETHER = ResourceKey.create( + Registry.NOISE_GENERATOR_SETTINGS_REGISTRY, + BCLib.makeID("amplified_nether") + ); + public final BiomeSource initialBiomeSource; public BCLChunkGenerator( @@ -226,4 +232,24 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto // // return Holder.direct(noise); } + + + public static NoiseGeneratorSettings amplifiedNether() { + return new NoiseGeneratorSettings( + NETHER_NOISE_SETTINGS_AMPLIFIED, + Blocks.NETHERRACK.defaultBlockState(), + Blocks.LAVA.defaultBlockState(), + NoiseRouterData.noNewCaves( + BuiltinRegistries.DENSITY_FUNCTION, + NoiseRouterData.slideNetherLike(BuiltinRegistries.DENSITY_FUNCTION, 0, 256) + ), + SurfaceRuleData.nether(), + List.of(), + 32, + false, + false, + false, + true + ); + } } diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java index 41cc5a91..7d9ebbab 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java @@ -18,33 +18,38 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig o.biomeSizeVertical), Codec.BOOL.fieldOf("use_vertical_biomes") .orElse(DEFAULT.useVerticalBiomes) - .forGetter(o -> o.useVerticalBiomes) + .forGetter(o -> o.useVerticalBiomes), + Codec.BOOL.fieldOf("amplified") + .orElse(DEFAULT.amplified) + .forGetter(o -> o.amplified) ) .apply(instance, BCLNetherBiomeSourceConfig::new)); public final @NotNull NetherBiomeMapType mapVersion; @@ -69,17 +77,20 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig netherPage(BCLNetherBiomeSourceConfig netherConfig) { VerticalStack content = new VerticalStack(fill(), fit()).centerHorizontal(); @@ -78,6 +79,12 @@ public class WorldSetupScreen extends LayoutScreen { netherConfig.mapVersion == BCLNetherBiomeSourceConfig.NetherBiomeMapType.SQUARE ); + netherAmplified = content.indent(20).addCheckbox( + fit(), fit(), + Component.translatable("title.screen.bclib.worldgen.nether_amplified"), + netherConfig.amplified + ); + netherVertical = content.indent(20).addCheckbox( fit(), fit(), Component.translatable("title.screen.bclib.worldgen.nether_vertical"), @@ -109,6 +116,7 @@ public class WorldSetupScreen extends LayoutScreen { bclibNether.onChange((cb, state) -> { netherLegacy.setEnabled(state); + netherAmplified.setEnabled(state); netherVertical.setEnabled(state); netherBiomeSize.setEnabled(state); netherVerticalBiomeSize.setEnabled(state && netherVertical.isChecked()); @@ -234,6 +242,8 @@ public class WorldSetupScreen extends LayoutScreen { private void updateSettings() { Map, ChunkGenerator> betterxDimensions = TogetherWorldPreset.getDimensionsMap( PresetsRegistry.BCL_WORLD); + Map, ChunkGenerator> betterxAmplifiedDimensions = TogetherWorldPreset.getDimensionsMap( + PresetsRegistry.BCL_WORLD_AMPLIFIED); Map, ChunkGenerator> vanillaDimensions = TogetherWorldPreset.getDimensionsMap( WorldPresets.NORMAL); BCLEndBiomeSourceConfig.EndBiomeMapType endVersion = BCLEndBiomeSourceConfig.DEFAULT.mapVersion; @@ -271,10 +281,15 @@ public class WorldSetupScreen extends LayoutScreen { : BCLNetherBiomeSourceConfig.NetherBiomeMapType.HEX, netherBiomeSize.getValue() * 16, netherVerticalBiomeSize.getValue() * 16, - netherVertical.isChecked() + netherVertical.isChecked(), + netherAmplified.isChecked() ); - ChunkGenerator netherGenerator = betterxDimensions.get(LevelStem.NETHER); + ChunkGenerator netherGenerator = ( + netherAmplified.isChecked() + ? betterxAmplifiedDimensions + : betterxDimensions + ).get(LevelStem.NETHER); ((BCLibNetherBiomeSource) netherGenerator.getBiomeSource()).setTogetherConfig(netherConfig); updateConfiguration(LevelStem.NETHER, BuiltinDimensionTypes.NETHER, netherGenerator); diff --git a/src/main/java/org/betterx/bclib/mixin/common/NoiseGeneratorSettingsMixin.java b/src/main/java/org/betterx/bclib/mixin/common/NoiseGeneratorSettingsMixin.java new file mode 100644 index 00000000..849cd249 --- /dev/null +++ b/src/main/java/org/betterx/bclib/mixin/common/NoiseGeneratorSettingsMixin.java @@ -0,0 +1,36 @@ +package org.betterx.bclib.mixin.common; + +import org.betterx.bclib.api.v2.generator.BCLChunkGenerator; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(NoiseGeneratorSettings.class) +public abstract class NoiseGeneratorSettingsMixin { + @Shadow + static protected Holder register( + Registry registry, + ResourceKey resourceKey, + NoiseGeneratorSettings noiseGeneratorSettings + ) { + return null; + } + + ; + + @Inject(method = "bootstrap", at = @At("HEAD")) + private static void bcl_addNoiseGenerators( + Registry registry, + CallbackInfoReturnable> cir + ) { + register(registry, BCLChunkGenerator.AMPLIFIED_NETHER, BCLChunkGenerator.amplifiedNether()); + } +} diff --git a/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java b/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java index c47a4e77..c8564ebd 100644 --- a/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java +++ b/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java @@ -1,6 +1,7 @@ package org.betterx.bclib.registry; import org.betterx.bclib.BCLib; +import org.betterx.bclib.api.v2.generator.BCLChunkGenerator; import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig; import org.betterx.bclib.api.v2.generator.config.BCLNetherBiomeSourceConfig; import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; @@ -19,6 +20,7 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset; import java.util.Map; public class PresetsRegistry implements WorldPresetBootstrap { + public static ResourceKey BCL_WORLD; public static ResourceKey BCL_WORLD_LARGE; public static ResourceKey BCL_WORLD_AMPLIFIED; @@ -31,9 +33,8 @@ public class PresetsRegistry implements WorldPresetBootstrap { (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> buildPreset( overworldStem, - netherContext, - BCLNetherBiomeSourceConfig.DEFAULT, endContext, - BCLEndBiomeSourceConfig.DEFAULT + netherContext, BCLNetherBiomeSourceConfig.DEFAULT, + endContext, BCLEndBiomeSourceConfig.DEFAULT ), true ); @@ -56,23 +57,31 @@ public class PresetsRegistry implements WorldPresetBootstrap { true ); - BCL_WORLD_AMPLIFIED = - WorldPresets.register( - BCLib.makeID("amplified"), - (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { - Holder largeBiomeGenerator = noiseSettings - .getOrCreateHolderOrThrow(NoiseGeneratorSettings.AMPLIFIED); - return buildPreset( - noiseBasedOverworld.make( - overworldStem.generator().getBiomeSource(), - largeBiomeGenerator - ), - netherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED, - endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED - ); - }, - true - ); + BCL_WORLD_AMPLIFIED = WorldPresets.register( + BCLib.makeID("amplified"), + (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { + Holder amplifiedBiomeGenerator = noiseSettings + .getOrCreateHolderOrThrow(NoiseGeneratorSettings.AMPLIFIED); + + WorldGenUtil.Context amplifiedNetherContext = new WorldGenUtil.Context( + netherContext.biomes, + netherContext.dimension, + netherContext.structureSets, + netherContext.noiseParameters, + Holder.direct(BCLChunkGenerator.amplifiedNether()) + ); + + return buildPreset( + noiseBasedOverworld.make( + overworldStem.generator().getBiomeSource(), + amplifiedBiomeGenerator + ), + amplifiedNetherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED, + endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED + ); + }, + true + ); BCL_WORLD_17 = WorldPresets.register( BCLib.makeID("legacy_17"), diff --git a/src/main/resources/assets/bclib/lang/de_de.json b/src/main/resources/assets/bclib/lang/de_de.json index 57362d0c..7288a18f 100644 --- a/src/main/resources/assets/bclib/lang/de_de.json +++ b/src/main/resources/assets/bclib/lang/de_de.json @@ -64,6 +64,7 @@ "title.screen.bclib.worldgen.nether_biome_size": "Größe", "title.screen.bclib.worldgen.nether_vertical_biome_size": "Biomhöhe", "title.screen.bclib.worldgen.nether_vertical": "Biome auch vertikal verteilen", + "title.screen.bclib.worldgen.nether_amplified": "Doppelte Höhe", "title.screen.bclib.worldgen.land_biome_size": "Land-Biome", "title.screen.bclib.worldgen.void_biome_size": "Kleine Inseln", "title.screen.bclib.worldgen.center_biome_size": "Zentralbiome", diff --git a/src/main/resources/assets/bclib/lang/en_us.json b/src/main/resources/assets/bclib/lang/en_us.json index d3d35f7e..1c5a527d 100644 --- a/src/main/resources/assets/bclib/lang/en_us.json +++ b/src/main/resources/assets/bclib/lang/en_us.json @@ -67,6 +67,7 @@ "title.screen.bclib.worldgen.nether_biome_size": "Biome Size", "title.screen.bclib.worldgen.nether_vertical_biome_size": "Biome Height", "title.screen.bclib.worldgen.nether_vertical": "Generate vertical Biomes", + "title.screen.bclib.worldgen.nether_amplified": "Double Height", "title.screen.bclib.worldgen.land_biome_size": "Land Biomes", "title.screen.bclib.worldgen.void_biome_size": "Small Island Biomes", "title.screen.bclib.worldgen.center_biome_size": "Central Biomes", diff --git a/src/main/resources/bclib.accesswidener b/src/main/resources/bclib.accesswidener index a9751021..868e9918 100644 --- a/src/main/resources/bclib.accesswidener +++ b/src/main/resources/bclib.accesswidener @@ -21,6 +21,8 @@ accessible method net/minecraft/world/entity/ai/village/poi/PoiTypes register (L accessible method net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource (Ljava/util/List;)V accessible method net/minecraft/core/Registry registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/Registry$RegistryBootstrap;)Lnet/minecraft/core/Registry; accessible method net/minecraft/world/entity/SpawnPlacements register (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/SpawnPlacements$Type;Lnet/minecraft/world/level/levelgen/Heightmap$Types;Lnet/minecraft/world/entity/SpawnPlacements$SpawnPredicate;)V - +accessible method net/minecraft/world/level/levelgen/NoiseRouterData nether (Lnet/minecraft/core/Registry;)Lnet/minecraft/world/level/levelgen/NoiseRouter; +accessible method net/minecraft/world/level/levelgen/NoiseRouterData noNewCaves (Lnet/minecraft/core/Registry;Lnet/minecraft/world/level/levelgen/DensityFunction;)Lnet/minecraft/world/level/levelgen/NoiseRouter; +accessible method net/minecraft/world/level/levelgen/NoiseRouterData slideNetherLike (Lnet/minecraft/core/Registry;II)Lnet/minecraft/world/level/levelgen/DensityFunction; #Fields accessible field net/minecraft/world/entity/ai/village/poi/PoiTypes TYPE_BY_STATE Ljava/util/Map; \ No newline at end of file From 1cd070dbfb733f670f201d72bd4b661b3d2b1da0 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 16:00:25 +0100 Subject: [PATCH 13/24] Automate Curseforge Upload --- build.gradle | 38 ++++++++++++++++++++++++++++++++++++++ gradle.properties | 3 ++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 92fa88fe..8ccd9886 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,7 @@ plugins { id 'fabric-loom' version "${loom_version}" id 'maven-publish' id "com.modrinth.minotaur" version "2.+" + id "com.matthewprenger.cursegradle" version "1.4.0" } apply from: "bclib.gradle" @@ -99,4 +100,41 @@ modrinth { required.project "fabric-api" } debugMode = false +} + +curseforge { + def slurper = new groovy.json.JsonSlurper() + apiKey = new File(projectDir, "../CURSEFORGE_TOKEN") + if (apiKey.exists()) { + apiKey = apiKey.text + } else { + apiKey = "" + } + + def changes = new File(projectDir, "CHANGES.md") + if (changes.exists()) { + changes = changes.getText('UTF-8') + } else { + changes = "" + } + + project { + id = '495191' + changelogType = 'markdown' + changelog = changes + releaseType = project.release_channel + for (item in slurper.parseText(project.modrinth_versions)) { + addGameVersion item + } + mainArtifact(jar) { + displayName = "$project.archives_base_name-$project.version [1.19.2]" + relations { + requiredDependency 'fabric-api' + } + } + } + + options { + debug = false + } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a8d1f710..eab91e09 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,8 @@ org.gradle.jvmargs=-Xmx8G #Modrinth modrinth_versions=["1.19", "1.19.1", "1.19.2"] -release_channel=release #`release`, `beta` or `alpha` +#`release`, `beta` or `alpha` +release_channel=release #Loom loom_version=0.12-SNAPSHOT # Fabric Properties From 73a9c1f2fed590f167618f8e11d2899cb2d6236f Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 16:09:25 +0100 Subject: [PATCH 14/24] Fixed Curseforge Upload --- build.gradle | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 8ccd9886..560d6c2d 100644 --- a/build.gradle +++ b/build.gradle @@ -126,15 +126,19 @@ curseforge { for (item in slurper.parseText(project.modrinth_versions)) { addGameVersion item } - mainArtifact(jar) { + relations { + requiredDependency 'fabric-api' + } + mainArtifact(remapJar) { displayName = "$project.archives_base_name-$project.version [1.19.2]" - relations { - requiredDependency 'fabric-api' - } + } + afterEvaluate { + mainArtifact(remapJar.outputs) } } options { debug = false + forgeGradleIntegration = false } } \ No newline at end of file From f63f0ef5fcc3cfe5bb5477a01d568d082d3b4780 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 16:14:21 +0100 Subject: [PATCH 15/24] Auto append latest version --- build.gradle | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 560d6c2d..12bbff3f 100644 --- a/build.gradle +++ b/build.gradle @@ -123,14 +123,19 @@ curseforge { changelogType = 'markdown' changelog = changes releaseType = project.release_channel - for (item in slurper.parseText(project.modrinth_versions)) { - addGameVersion item + def versions = slurper.parseText(project.modrinth_versions); + def latestVersion = '' + for (v in versions) { + addGameVersion v + latestVersion = "[$v]" } + addGameVersion 'Fabric' + addGameVersion 'Java 17' relations { requiredDependency 'fabric-api' } mainArtifact(remapJar) { - displayName = "$project.archives_base_name-$project.version [1.19.2]" + displayName = "$project.archives_base_name-$project.version $latestVersion" } afterEvaluate { mainArtifact(remapJar.outputs) From 4d626b23b2675a606b198e71158a9bbc85092d3d Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 17:28:58 +0100 Subject: [PATCH 16/24] Modrinth as default Update location (can be configured to revert to curseforge as default) --- .../client/gui/screens/UpdatesScreen.java | 43 ++++++++++++++++++- .../betterx/bclib/config/ClientConfig.java | 17 +++++++- .../org/betterx/bclib/config/MainConfig.java | 15 ++++--- .../bclib/networking/VersionChecker.java | 6 +-- .../resources/assets/bclib/lang/de_de.json | 3 ++ .../resources/assets/bclib/lang/en_us.json | 3 ++ src/main/resources/fabric.mod.json | 8 +++- 7 files changed, 81 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/betterx/bclib/client/gui/screens/UpdatesScreen.java b/src/main/java/org/betterx/bclib/client/gui/screens/UpdatesScreen.java index b4130ebc..62413c75 100644 --- a/src/main/java/org/betterx/bclib/client/gui/screens/UpdatesScreen.java +++ b/src/main/java/org/betterx/bclib/client/gui/screens/UpdatesScreen.java @@ -80,8 +80,47 @@ public class UpdatesScreen extends BCLibLayoutScreen { row.addText(fit(), fit(), Component.literal(" -> ")); row.addText(fit(), fit(), Component.literal(updated)).setColor(ColorUtil.GREEN); row.addFiller(); - if (nfo != null && nfo.getMetadata().getContact().get("homepage").isPresent()) { - row.addButton(fit(), fit(), Component.translatable("bclib.updates.curseforge_link")) + boolean createdDownloadLink = false; + if (nfo != null + && nfo.getMetadata().getCustomValue("bclib") != null + && nfo.getMetadata().getCustomValue("bclib").getAsObject().get("downloads") != null) { + CustomValue.CvObject downloadLinks = nfo.getMetadata() + .getCustomValue("bclib") + .getAsObject() + .get("downloads") + .getAsObject(); + String link = null; + Component name = null; + if (Configs.CLIENT_CONFIG.preferModrinthForUpdates() && downloadLinks.get("modrinth") != null) { + link = downloadLinks.get("modrinth").getAsString(); + name = Component.translatable("bclib.updates.modrinth_link"); +// row.addButton(fit(), fit(), Component.translatable("bclib.updates.modrinth_link")) +// .onPress((bt) -> { +// this.openLink(downloadLinks.get("modrinth").getAsString()); +// }).centerVertical(); +// createdDownloadLink = true; + } else if (downloadLinks.get("curseforge") != null) { + link = downloadLinks.get("curseforge").getAsString(); + name = Component.translatable("bclib.updates.curseforge_link"); +// row.addButton(fit(), fit(), Component.translatable("bclib.updates.curseforge_link")) +// .onPress((bt) -> { +// this.openLink(downloadLinks.get("curseforge").getAsString()); +// }).centerVertical(); +// createdDownloadLink = true; + } + + if (link != null) { + createdDownloadLink = true; + final String finalLink = link; + row.addButton(fit(), fit(), name) + .onPress((bt) -> { + this.openLink(finalLink); + }).centerVertical(); + } + } + + if (!createdDownloadLink && nfo != null && nfo.getMetadata().getContact().get("homepage").isPresent()) { + row.addButton(fit(), fit(), Component.translatable("bclib.updates.download_link")) .onPress((bt) -> { this.openLink(nfo.getMetadata().getContact().get("homepage").get()); }).centerVertical(); diff --git a/src/main/java/org/betterx/bclib/config/ClientConfig.java b/src/main/java/org/betterx/bclib/config/ClientConfig.java index 13d46f3d..dd43b0da 100644 --- a/src/main/java/org/betterx/bclib/config/ClientConfig.java +++ b/src/main/java/org/betterx/bclib/config/ClientConfig.java @@ -11,7 +11,6 @@ public class ClientConfig extends NamedPathConfig { "didShowWelcome", "version" ); - @ConfigUI(topPadding = 12) public static final ConfigToken CHECK_VERSIONS = ConfigToken.Boolean( true, "check", @@ -24,12 +23,20 @@ public class ClientConfig extends NamedPathConfig { "ui" ); + @ConfigUI(leftPadding = 8) + public static final ConfigToken PREFER_MODRINTH_FOR_UPDATES = ConfigToken.Boolean( + true, + "preferModrinthForUpdates", + "ui" + ); + @ConfigUI(hide = true) public static final ConfigToken FORCE_BETTERX_PRESET = ConfigToken.Boolean( true, "forceBetterXPreset", "ui" ); + @ConfigUI(topPadding = 12) public static final ConfigToken SUPPRESS_EXPERIMENTAL_DIALOG = ConfigToken.Boolean( false, "suppressExperimentalDialogOnLoad", @@ -107,6 +114,8 @@ public class ClientConfig extends NamedPathConfig { "rendering", (config) -> config.get(CUSTOM_FOG_RENDERING) ); + + @ConfigUI(topPadding = 12) public static final ConfigToken SURVIES_ON_HINT = ConfigToken.Boolean( true, "survives_on_hint", @@ -194,8 +203,12 @@ public class ClientConfig extends NamedPathConfig { public void setForceBetterXPreset(boolean v) { set(FORCE_BETTERX_PRESET, v); } - + public boolean survivesOnHint() { return get(ClientConfig.SURVIES_ON_HINT); } + + public boolean preferModrinthForUpdates() { + return get(ClientConfig.PREFER_MODRINTH_FOR_UPDATES); + } } diff --git a/src/main/java/org/betterx/bclib/config/MainConfig.java b/src/main/java/org/betterx/bclib/config/MainConfig.java index 9e323261..7748a27b 100644 --- a/src/main/java/org/betterx/bclib/config/MainConfig.java +++ b/src/main/java/org/betterx/bclib/config/MainConfig.java @@ -3,11 +3,7 @@ package org.betterx.bclib.config; import org.betterx.bclib.BCLib; public class MainConfig extends NamedPathConfig { - public static final ConfigToken VERBOSE_LOGGING = ConfigToken.Boolean( - true, - "verbose", - Configs.MAIN_INFO_CATEGORY - ); + public static final ConfigToken APPLY_PATCHES = ConfigToken.Boolean( true, @@ -15,7 +11,7 @@ public class MainConfig extends NamedPathConfig { Configs.MAIN_PATCH_CATEGORY ); - @ConfigUI(leftPadding = 8, topPadding = 8) + @ConfigUI(leftPadding = 8) public static final ConfigToken REPAIR_BIOMES = DependendConfigToken.Boolean( false, "repairBiomesOnLoad", @@ -24,6 +20,13 @@ public class MainConfig extends NamedPathConfig { APPLY_PATCHES) ); + @ConfigUI(topPadding = 8) + public static final ConfigToken VERBOSE_LOGGING = ConfigToken.Boolean( + true, + "verbose", + Configs.MAIN_INFO_CATEGORY + ); + public MainConfig() { super(BCLib.MOD_ID, "main", true, true); diff --git a/src/main/java/org/betterx/bclib/networking/VersionChecker.java b/src/main/java/org/betterx/bclib/networking/VersionChecker.java index e0c882b4..e62fc33e 100644 --- a/src/main/java/org/betterx/bclib/networking/VersionChecker.java +++ b/src/main/java/org/betterx/bclib/networking/VersionChecker.java @@ -131,10 +131,10 @@ public class VersionChecker implements Runnable { } if (mod.n != null && mod.v != null && KNOWN_MODS.contains(mod.n)) { String installedVersion = ModUtil.getModVersion(mod.n); - boolean isNew = ModUtil.isLargerVersion(mod.v, installedVersion) && !installedVersion.equals( - "0.0.0"); + boolean isNew = ModUtil.isLargerVersion(mod.v, installedVersion) + && !installedVersion.equals("0.0.0"); BCLib.LOGGER.info(" - " + mod.n + ":" + mod.v + (isNew ? " (update available)" : "")); - if (isNew) + if (true || isNew) NEW_VERSIONS.add(mod); } } diff --git a/src/main/resources/assets/bclib/lang/de_de.json b/src/main/resources/assets/bclib/lang/de_de.json index 7288a18f..cc172610 100644 --- a/src/main/resources/assets/bclib/lang/de_de.json +++ b/src/main/resources/assets/bclib/lang/de_de.json @@ -73,6 +73,8 @@ "title.config.bclib.client.rendering.customFogRendering": "Angepasster Nebel", "title.config.bclib.client.rendering.netherThickFog": "Dicker Nether-Nebel", "bclib.updates.curseforge_link": "[CurseForge]", + "bclib.updates.modrinth_link": "[Modrinth]", + "bclib.updates.download_link": "Herunterladen", "bclib.updates.title": "Mod Aktualisierungen", "bclib.updates.disable_check": "Nicht Prüfen", "bclib.updates.donate_pre": "Gefallen Dir unsere Inhalte?\nDann erwäge eine kleine Spende :)", @@ -88,6 +90,7 @@ "title.config.bclib.main.infos.verbose": "Ausführliche Logs", "title.config.bclib.client.infos.survives_on_hint": "Zeige 'Überlebt auf' Tooltip", "description.config.bclib.client.ui.suppressExperimentalDialogOnLoad": "Der Warnbildschirm wird immer dann angezeigt, wenn Deine Welt nicht die Einstellungen der Vanilla-Version verwendet. Dies kann passieren, wenn Du eine Welt in einer Vorschauversion startest, aber auch wenn Du Mods verwendest, um die Welterzeugung zu verändern. Wenn diese Option aktiviert ist, wird die Warnung übersprungen, wenn Du eine bestehende Welt lädst. Sie wird weiterhin angezeigt (als Erinnerung), wenn eine neue Welt erstellt wird.", + "title.config.bclib.client.ui.preferModrinthForUpdates": "Bevorzuge Updates über Modrinth", "title.config.bclib.client.ui.forceBetterXPreset": "BetterX als Standard-Welt-Typ verwenden", "description.config.bclib.client.ui.forceBetterXPreset": "Der Welt-Typ bestimmt, wie eine Welt generiert wird. In den meisten Fällen solltet BetterX als Standardeinstellung beibehalten werden (Du kannst den Typ jederzeit im Welt-Erstellen-Bildschirm ändern). Dieser Typ ist für maximale Kompatibilität zwischen DataPacks, unserer Mod und anderen Fabric-Mods optimiert. Außerdem bietet er einige einzigartige Funktionen für BetterNether und BetterEnd. Du solltest diese Option nur deaktivieren, wenn Du einen Grund dazu hast!", "warning.config.bclib.client.ui.forceBetterXPreset": "IN DEN MEISTEN FÄLLEN SOLLTE DIESE OPTION AKTIVIERT BLEIBEN.\n", diff --git a/src/main/resources/assets/bclib/lang/en_us.json b/src/main/resources/assets/bclib/lang/en_us.json index 1c5a527d..bda8672f 100644 --- a/src/main/resources/assets/bclib/lang/en_us.json +++ b/src/main/resources/assets/bclib/lang/en_us.json @@ -31,6 +31,7 @@ "title.config.bclib.main.patches.applyPatches": "Automatically apply patches when loading level", "title.config.bclib.main.patches.repairBiomesOnLoad": "Fix Biomesource on level load", "title.config.bclib.client.ui.suppressExperimentalDialogOnLoad": "Disable Experimental Warning Screen on Load", + "title.config.bclib.client.ui.preferModrinthForUpdates": "Prefere Modrinth for Updates", "title.bclib.syncfiles.modInfo": "Mod Info", "title.bclib.syncfiles.modlist": "Mod Information", "message.bclib.syncfiles.modlist": "The following shows the state of your installed Mods.\n\nAll Mods that do not exist locally, or have a different version on the Server will be synchronized.", @@ -75,6 +76,8 @@ "title.screen.bclib.worldgen.central_radius": "Central Void Radius (in Chunks)", "title.screen.bclib.worldgen.end_void": "Generate Small Islands", "bclib.updates.curseforge_link": "[CurseForge]", + "bclib.updates.modrinth_link": "[Modrinth]", + "bclib.updates.download_link": "Download", "bclib.updates.title": "Mod Updates", "bclib.updates.disable_check": "Disable Check", "bclib.updates.donate_pre": "Like our Content?\nPlease consider a small Donation :)", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 136543ef..5789c574 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -10,7 +10,7 @@ "Bulldog83" ], "contact": { - "homepage": "https://www.curseforge.com/minecraft/mc-mods/bclib", + "homepage": "https://modrinth.com/mod/bclib", "issues": "https://github.com/quiqueck/bclib/issues", "sources": "https://github.com/quiqueck/bclib" }, @@ -55,6 +55,12 @@ ] }, "custom": { + "bclib": { + "downloads": { + "modrinth": "https://modrinth.com/mod/bclib", + "curseforge": "https://www.curseforge.com/minecraft/mc-mods/bclib" + } + }, "modmenu": { "links": { "title.link.bclib.discord": "https://discord.gg/kYuATbYbKW" From 22a1cd7c2697fa817a19f861b36ab81b057ab3f9 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 17:30:32 +0100 Subject: [PATCH 17/24] Re-Enable version test --- src/main/java/org/betterx/bclib/networking/VersionChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/betterx/bclib/networking/VersionChecker.java b/src/main/java/org/betterx/bclib/networking/VersionChecker.java index e62fc33e..209a29dc 100644 --- a/src/main/java/org/betterx/bclib/networking/VersionChecker.java +++ b/src/main/java/org/betterx/bclib/networking/VersionChecker.java @@ -134,7 +134,7 @@ public class VersionChecker implements Runnable { boolean isNew = ModUtil.isLargerVersion(mod.v, installedVersion) && !installedVersion.equals("0.0.0"); BCLib.LOGGER.info(" - " + mod.n + ":" + mod.v + (isNew ? " (update available)" : "")); - if (true || isNew) + if (isNew) NEW_VERSIONS.add(mod); } } From 04373ebff8be6a027363f1b7a10ca58b7b3e8060 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 17:51:12 +0100 Subject: [PATCH 18/24] Version Bump --- gradle.properties | 2 +- src/main/resources/fabric.mod.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index eab91e09..a70fb26a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ minecraft_version=1.19.2 loader_version=0.14.9 fabric_version=0.60.0+1.19.2 # Mod Properties -mod_version=2.1.3 +mod_version=2.1.4 maven_group=org.betterx.bclib archives_base_name=bclib # Dependencies diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 5789c574..54252cc5 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "bclib", - "version": "2.1.3", + "version": "2.1.4", "name": "BCLib", "description": "A library for BetterX team mods", "authors": [ From 5d431157c796d1b5e36a5ff9c3339ea82b39ecca Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 16 Nov 2022 17:54:37 +0100 Subject: [PATCH 19/24] [Changes] Better Wording for double height Nether --- src/main/resources/assets/bclib/lang/de_de.json | 2 +- src/main/resources/assets/bclib/lang/en_us.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/bclib/lang/de_de.json b/src/main/resources/assets/bclib/lang/de_de.json index cc172610..fe2f26a6 100644 --- a/src/main/resources/assets/bclib/lang/de_de.json +++ b/src/main/resources/assets/bclib/lang/de_de.json @@ -64,7 +64,7 @@ "title.screen.bclib.worldgen.nether_biome_size": "Größe", "title.screen.bclib.worldgen.nether_vertical_biome_size": "Biomhöhe", "title.screen.bclib.worldgen.nether_vertical": "Biome auch vertikal verteilen", - "title.screen.bclib.worldgen.nether_amplified": "Doppelte Höhe", + "title.screen.bclib.worldgen.nether_amplified": "Doppelte Netherhöhe (Amplified)", "title.screen.bclib.worldgen.land_biome_size": "Land-Biome", "title.screen.bclib.worldgen.void_biome_size": "Kleine Inseln", "title.screen.bclib.worldgen.center_biome_size": "Zentralbiome", diff --git a/src/main/resources/assets/bclib/lang/en_us.json b/src/main/resources/assets/bclib/lang/en_us.json index bda8672f..49ccb76b 100644 --- a/src/main/resources/assets/bclib/lang/en_us.json +++ b/src/main/resources/assets/bclib/lang/en_us.json @@ -68,7 +68,7 @@ "title.screen.bclib.worldgen.nether_biome_size": "Biome Size", "title.screen.bclib.worldgen.nether_vertical_biome_size": "Biome Height", "title.screen.bclib.worldgen.nether_vertical": "Generate vertical Biomes", - "title.screen.bclib.worldgen.nether_amplified": "Double Height", + "title.screen.bclib.worldgen.nether_amplified": "Double the Nether Height (Amplified)", "title.screen.bclib.worldgen.land_biome_size": "Land Biomes", "title.screen.bclib.worldgen.void_biome_size": "Small Island Biomes", "title.screen.bclib.worldgen.center_biome_size": "Central Biomes", From 781a74753749fb5a1e41ee1dc439673fa830f827 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 18 Nov 2022 18:20:16 +0100 Subject: [PATCH 20/24] [Changes] Added new PlacementFilter for Biome IDs --- .../levelgen/features/placement/InBiome.java | 69 +++++++++++++++++++ .../placement/PlacementModifiers.java | 5 ++ 2 files changed, 74 insertions(+) create mode 100644 src/main/java/org/betterx/bclib/api/v3/levelgen/features/placement/InBiome.java diff --git a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/placement/InBiome.java b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/placement/InBiome.java new file mode 100644 index 00000000..71f85b89 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/placement/InBiome.java @@ -0,0 +1,69 @@ +package org.betterx.bclib.api.v3.levelgen.features.placement; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.placement.PlacementContext; +import net.minecraft.world.level.levelgen.placement.PlacementFilter; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; + +import java.util.List; +import java.util.Optional; + +public class InBiome extends PlacementFilter { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance + .group( + Codec.BOOL + .fieldOf("negate") + .orElse(false) + .forGetter(cfg -> cfg.negate), + Codec.list(ResourceLocation.CODEC) + .fieldOf("biomes") + .forGetter(cfg -> cfg.biomeIDs) + ) + .apply(instance, InBiome::new)); + + public final List biomeIDs; + public final boolean negate; + + protected InBiome(boolean negate, List biomeIDs) { + this.biomeIDs = biomeIDs; + this.negate = negate; + } + + public static InBiome matchingID(ResourceLocation... id) { + return new InBiome(false, List.of(id)); + } + + public static InBiome matchingID(List ids) { + return new InBiome(false, ids); + } + + public static InBiome notMatchingID(ResourceLocation... id) { + return new InBiome(true, List.of(id)); + } + + public static InBiome notMatchingID(List ids) { + return new InBiome(true, ids); + } + + @Override + protected boolean shouldPlace(PlacementContext ctx, RandomSource random, BlockPos pos) { + Holder holder = ctx.getLevel().getBiome(pos); + Optional biomeLocation = holder.unwrapKey().map(key -> key.location()); + if (biomeLocation.isPresent()) { + boolean contains = biomeIDs.contains(biomeLocation.get()); + return negate != contains; + } + return false; + } + + @Override + public PlacementModifierType type() { + return PlacementModifiers.IN_BIOME; + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/placement/PlacementModifiers.java b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/placement/PlacementModifiers.java index 62248abc..0f1bb7fa 100644 --- a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/placement/PlacementModifiers.java +++ b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/placement/PlacementModifiers.java @@ -71,6 +71,11 @@ public class PlacementModifiers { UnderEveryLayer.CODEC ); + public static final PlacementModifierType IN_BIOME = register( + "in_biome", + InBiome.CODEC + ); + private static

PlacementModifierType

register(String path, Codec

codec) { return register(BCLib.makeID(path), codec); From 9d7566986eccdb313bb4b35a4a5eeab78d1b53eb Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 18 Nov 2022 18:20:41 +0100 Subject: [PATCH 21/24] [Changes] Improved FeatureAPI for use with Bonemeal-Features --- .../levelgen/features/BCLFeatureBuilder.java | 153 +++++++++++++++--- .../features/CommonPlacedFeatureBuilder.java | 9 ++ .../bclib/api/v3/tag/BCLBlockTags.java | 7 + 3 files changed, 145 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java index dd53e5bf..cbcc7349 100644 --- a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java +++ b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java @@ -44,7 +44,7 @@ import org.jetbrains.annotations.NotNull; @SuppressWarnings("unused") public abstract class BCLFeatureBuilder, FC extends FeatureConfiguration> { - private final ResourceLocation featureID; + protected final ResourceLocation featureID; private final F feature; private BCLFeatureBuilder(ResourceLocation featureID, F feature) { @@ -100,6 +100,22 @@ public abstract class BCLFeatureBuilder, FC extends Featur ); } + public static WeightedBlockPatch startWeightedRandomPatch( + ResourceLocation featureID + ) { + return new WeightedBlockPatch( + featureID, + (RandomPatchFeature) Feature.RANDOM_PATCH + ); + } + + public static WeightedBlockPatch startBonemealPatch( + ResourceLocation featureID + ) { + return startWeightedRandomPatch(featureID).likeDefaultBonemeal(); + } + + public static RandomPatch startRandomPatch( ResourceLocation featureID, Holder featureToPlace @@ -782,9 +798,86 @@ public abstract class BCLFeatureBuilder, FC extends Featur } } - public static class WeightedBlock extends BCLFeatureBuilder { - SimpleWeightedRandomList.Builder stateBuilder = SimpleWeightedRandomList.builder(); + public static class WeightedBlockPatch extends WeightedBaseBlock { + private BlockPredicate groundType = null; + private boolean isEmpty = true; + private int tries = 96; + private int xzSpread = 7; + private int ySpread = 3; + + protected WeightedBlockPatch(@NotNull ResourceLocation featureID, @NotNull RandomPatchFeature feature) { + super(featureID, feature); + } + + public WeightedBlockPatch isEmpty() { + return this.isEmpty(true); + } + + public WeightedBlockPatch isEmpty(boolean value) { + this.isEmpty = value; + return this; + } + + public WeightedBlockPatch isOn(BlockPredicate predicate) { + this.groundType = predicate; + return this; + } + + public WeightedBlockPatch isEmptyAndOn(BlockPredicate predicate) { + return this.isEmpty().isOn(predicate); + } + + public WeightedBlockPatch likeDefaultNetherVegetation() { + return likeDefaultNetherVegetation(8, 4); + } + + public WeightedBlockPatch likeDefaultNetherVegetation(int xzSpread, int ySpread) { + this.xzSpread = xzSpread; + this.ySpread = ySpread; + tries = xzSpread * xzSpread; + return this; + } + + public WeightedBlockPatch likeDefaultBonemeal() { + return this.tries(9) + .spreadXZ(3) + .spreadY(1); + } + + public WeightedBlockPatch tries(int v) { + tries = v; + return this; + } + + public WeightedBlockPatch spreadXZ(int v) { + xzSpread = v; + return this; + } + + public WeightedBlockPatch spreadY(int v) { + ySpread = v; + return this; + } + + @Override + public RandomPatchConfiguration createConfiguration() { + BCLInlinePlacedBuilder, SimpleBlockConfiguration> blockFeature = BCLFeatureBuilder + .start( + new ResourceLocation(featureID.getNamespace(), "tmp_" + featureID.getPath()), + Feature.SIMPLE_BLOCK + ) + .configuration(new SimpleBlockConfiguration(new WeightedStateProvider(stateBuilder.build()))) + .inlinePlace(); + + if (isEmpty) blockFeature.isEmpty(); + if (groundType != null) blockFeature.isOn(groundType); + + return new RandomPatchConfiguration(tries, xzSpread, ySpread, blockFeature.build()); + } + } + + public static class WeightedBlock extends WeightedBaseBlock { private WeightedBlock( @NotNull ResourceLocation featureID, @NotNull SimpleBlockFeature feature @@ -792,33 +885,45 @@ public abstract class BCLFeatureBuilder, FC extends Featur super(featureID, feature); } - public WeightedBlock add(Block block, int weight) { - return add(block.defaultBlockState(), weight); - } - - public WeightedBlock add(BlockState state, int weight) { - stateBuilder.add(state, weight); - return this; - } - - public WeightedBlock addAllStates(Block block, int weight) { - Set states = BCLPoiType.getBlockStates(block); - states.forEach(s -> add(block.defaultBlockState(), Math.max(1, weight / states.size()))); - return this; - } - - public WeightedBlock addAllStatesFor(IntegerProperty prop, Block block, int weight) { - Collection values = prop.getPossibleValues(); - values.forEach(s -> add(block.defaultBlockState().setValue(prop, s), Math.max(1, weight / values.size()))); - return this; - } - @Override public SimpleBlockConfiguration createConfiguration() { return new SimpleBlockConfiguration(new WeightedStateProvider(stateBuilder.build())); } } + + private abstract static class WeightedBaseBlock, FC extends FeatureConfiguration, W extends WeightedBaseBlock> extends BCLFeatureBuilder { + SimpleWeightedRandomList.Builder stateBuilder = SimpleWeightedRandomList.builder(); + + protected WeightedBaseBlock( + @NotNull ResourceLocation featureID, + @NotNull F feature + ) { + super(featureID, feature); + } + + public W add(Block block, int weight) { + return add(block.defaultBlockState(), weight); + } + + public W add(BlockState state, int weight) { + stateBuilder.add(state, weight); + return (W) this; + } + + public W addAllStates(Block block, int weight) { + Set states = BCLPoiType.getBlockStates(block); + states.forEach(s -> add(block.defaultBlockState(), Math.max(1, weight / states.size()))); + return (W) this; + } + + public W addAllStatesFor(IntegerProperty prop, Block block, int weight) { + Collection values = prop.getPossibleValues(); + values.forEach(s -> add(block.defaultBlockState().setValue(prop, s), Math.max(1, weight / values.size()))); + return (W) this; + } + } + public static class AsRandomSelect extends BCLFeatureBuilder { private final List features = new LinkedList<>(); private Holder defaultFeature; diff --git a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/CommonPlacedFeatureBuilder.java b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/CommonPlacedFeatureBuilder.java index 781b0218..a668dfd0 100644 --- a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/CommonPlacedFeatureBuilder.java +++ b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/CommonPlacedFeatureBuilder.java @@ -354,6 +354,15 @@ abstract class CommonPlacedFeatureBuilder, FC extends Feat return modifier(Is.below(predicate)); } + + public T inBiomes(ResourceLocation... biomeID) { + return modifier(InBiome.matchingID(biomeID)); + } + + public T notInBiomes(ResourceLocation... biomeID) { + return modifier(InBiome.notMatchingID(biomeID)); + } + public T isEmptyAndOn(BlockPredicate predicate) { return (T) this.isEmpty().isOn(predicate); } diff --git a/src/main/java/org/betterx/bclib/api/v3/tag/BCLBlockTags.java b/src/main/java/org/betterx/bclib/api/v3/tag/BCLBlockTags.java index ca638a64..0f30054b 100644 --- a/src/main/java/org/betterx/bclib/api/v3/tag/BCLBlockTags.java +++ b/src/main/java/org/betterx/bclib/api/v3/tag/BCLBlockTags.java @@ -21,11 +21,18 @@ public class BCLBlockTags { public static final TagKey BONEMEAL_TARGET_END_STONE = TagManager.BLOCKS.makeTogetherTag( "bonemeal/target/end_stone" ); + public static final TagKey BONEMEAL_SOURCE_OBSIDIAN = TagManager.BLOCKS.makeTogetherTag( + "bonemeal/source/obsidian" + ); + public static final TagKey BONEMEAL_TARGET_OBSIDIAN = TagManager.BLOCKS.makeTogetherTag( + "bonemeal/target/obsidian" + ); @ApiStatus.Internal public static void ensureStaticallyLoaded() { TagManager.BLOCKS.add(BONEMEAL_SOURCE_NETHERRACK, Blocks.WARPED_NYLIUM, Blocks.CRIMSON_NYLIUM); TagManager.BLOCKS.add(BONEMEAL_TARGET_NETHERRACK, Blocks.NETHERRACK); TagManager.BLOCKS.add(BONEMEAL_TARGET_END_STONE, Blocks.END_STONE); + TagManager.BLOCKS.add(BONEMEAL_TARGET_OBSIDIAN, Blocks.OBSIDIAN); } } From 7a3a3e0afbf31cda9883374a8d9cfa30ccb696b4 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 25 Nov 2022 14:07:47 +0100 Subject: [PATCH 22/24] Backward Compat --- .../levelgen/features/BCLFeatureBuilder.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java index cbcc7349..37ae4440 100644 --- a/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java +++ b/src/main/java/org/betterx/bclib/api/v3/levelgen/features/BCLFeatureBuilder.java @@ -889,6 +889,33 @@ public abstract class BCLFeatureBuilder, FC extends Featur public SimpleBlockConfiguration createConfiguration() { return new SimpleBlockConfiguration(new WeightedStateProvider(stateBuilder.build())); } + + //TODO: Remove in the next Minor Update. This method is just for backward compatibility. + + @Override + public WeightedBlock add(Block block, int weight) { + return super.add(block, weight); + } + + //TODO: Remove in the next Minor Update. This method is just for backward compatibility. + @Override + public WeightedBlock add(BlockState state, int weight) { + return super.add(state, weight); + } + + //TODO: Remove in the next Minor Update. This method is just for backward compatibility. + + @Override + public WeightedBlock addAllStates(Block block, int weight) { + return super.addAllStates(block, weight); + } + + //TODO: Remove in the next Minor Update. This method is just for backward compatibility. + + @Override + public WeightedBlock addAllStatesFor(IntegerProperty prop, Block block, int weight) { + return super.addAllStatesFor(prop, block, weight); + } } From 40a0082ca85bc49af1de7e0533052c025cf61d90 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 25 Nov 2022 15:03:20 +0100 Subject: [PATCH 23/24] Version Bump --- gradle.properties | 2 +- src/main/resources/fabric.mod.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index a70fb26a..81cb70a6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ minecraft_version=1.19.2 loader_version=0.14.9 fabric_version=0.60.0+1.19.2 # Mod Properties -mod_version=2.1.4 +mod_version=2.1.5 maven_group=org.betterx.bclib archives_base_name=bclib # Dependencies diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 54252cc5..826c695f 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "bclib", - "version": "2.1.4", + "version": "2.1.5", "name": "BCLib", "description": "A library for BetterX team mods", "authors": [ From 296cc027cc9467f2f50d40a1a09318f5c1616bfa Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 25 Nov 2022 15:40:59 +0100 Subject: [PATCH 24/24] [Change] Log Amplified Setting for Nether --- .../api/v2/generator/config/BCLNetherBiomeSourceConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java index 7d9ebbab..7aa896c7 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/config/BCLNetherBiomeSourceConfig.java @@ -98,6 +98,7 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig