From b0922d967fa76da6def15bdb93c6cea162484e0a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 20 Jun 2021 18:49:53 +0300 Subject: [PATCH 1/8] Server side crash fix --- gradle.properties | 4 ++-- src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java | 3 +++ src/main/java/ru/betterend/blocks/ChandelierBlock.java | 5 +++++ src/main/java/ru/betterend/blocks/EmeraldIceBlock.java | 3 +++ .../java/ru/betterend/blocks/HydraluxPetalColoredBlock.java | 3 +++ src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java | 4 ++++ .../java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java | 1 + src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java | 3 +++ src/main/java/ru/betterend/blocks/basis/PedestalBlock.java | 5 +++++ .../java/ru/betterend/blocks/basis/StoneLanternBlock.java | 3 +++ src/main/java/ru/betterend/item/EnchantedItem.java | 3 +++ src/main/java/ru/betterend/item/EndAnvilItem.java | 3 +++ src/main/java/ru/betterend/item/tool/EndHammerItem.java | 3 +++ src/main/java/ru/betterend/rituals/InfusionRitual.java | 1 - src/main/resources/fabric.mod.json | 2 +- 15 files changed, 42 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index f902a279..a15787e2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8-pre +mod_version = 0.9.8.1-pre maven_group = ru.betterend archives_base_name = better-end @@ -17,5 +17,5 @@ archives_base_name = better-end patchouli_version = 50-FABRIC fabric_version = 0.32.9+1.16 canvas_version = 1.0.+ -bclib_version = 0.1.38 +bclib_version = 0.1.42 rei_version = 5.8.10 \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index 0302faab..dc0ad6c3 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.renderer.block.model.BlockModel; @@ -57,6 +59,7 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = Maps.newHashMap(); textures.put("%glow%", getGlowTexture()); diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 21a906f7..622eeb5e 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -8,6 +8,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.BlockModelRotation; @@ -46,11 +48,13 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation blockId) { return ModelsHelper.createItemModel(blockId); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern; switch (blockState.getValue(FACING)) { @@ -67,6 +71,7 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { String state = "_wall"; BlockModelRotation rotation = BlockModelRotation.X0_Y0; diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index f8c010f1..e4ebe572 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -6,6 +6,8 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; @@ -85,6 +87,7 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index f9a882b5..599bbe15 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -4,6 +4,8 @@ import java.util.Optional; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -31,6 +33,7 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String path = "betterend:block/block_petal_colored"; Optional pattern = Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path); diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index caf38d89..681e3578 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -71,11 +73,13 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern = Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); return ModelsHelper.fromPattern(pattern); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 67ad0a06..b267bf84 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -81,6 +81,7 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index f66fa6dc..f4ada8b3 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -2,6 +2,8 @@ package ru.betterend.blocks.basis; import java.util.Map; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; @@ -125,6 +127,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { String floor = blockState.getValue(IS_FLOOR) ? "_floor" : ""; ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 886e8435..2f91a682 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -10,6 +10,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.UnbakedModel; @@ -370,11 +372,13 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation blockId) { return getBlockModel(blockId, defaultBlockState()); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = createTexturesMap(); PedestalState state = blockState.getValue(STATE); @@ -401,6 +405,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { PedestalState state = blockState.getValue(STATE); ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index b7319079..b8f2b7c9 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -4,6 +4,8 @@ import java.util.Optional; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -44,6 +46,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String blockName = resourceLocation.getPath(); Optional pattern = blockState.getValue(IS_FLOOR) ? diff --git a/src/main/java/ru/betterend/item/EnchantedItem.java b/src/main/java/ru/betterend/item/EnchantedItem.java index d210c855..814b9644 100644 --- a/src/main/java/ru/betterend/item/EnchantedItem.java +++ b/src/main/java/ru/betterend/item/EnchantedItem.java @@ -1,5 +1,7 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -25,6 +27,7 @@ public class EnchantedItem extends ModelProviderItem { } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { ResourceLocation sourceId = Registry.ITEM.getKey(source); return ModelsHelper.createItemModel(sourceId); diff --git a/src/main/java/ru/betterend/item/EndAnvilItem.java b/src/main/java/ru/betterend/item/EndAnvilItem.java index 9b8b4d04..c1b1625c 100644 --- a/src/main/java/ru/betterend/item/EndAnvilItem.java +++ b/src/main/java/ru/betterend/item/EndAnvilItem.java @@ -1,5 +1,7 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -30,6 +32,7 @@ public class EndAnvilItem extends BaseAnvilItem { } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { Block block = getBlock(); ResourceLocation blockId = Registry.BLOCK.getKey(block); diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index fa990cf9..0cef9ded 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -8,6 +8,8 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import io.netty.util.internal.ThreadLocalRandom; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; @@ -133,6 +135,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return ModelsHelper.createHandheldItem(resourceLocation); } diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index f240ec47..005e6b38 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -11,7 +11,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b880fc77..90a89ea6 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -46,7 +46,7 @@ "fabricloader": ">=0.11.0", "fabric": ">=0.32.0", "minecraft": ">=1.16.4", - "bclib": ">=0.1.38" + "bclib": ">=0.1.42" }, "suggests": { "byg": ">=1.1.3", From ff3194fedf97713d3fb22beea7b3f386abc0a4dc Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 01:22:30 +0300 Subject: [PATCH 2/8] Small water plant placing fix --- gradle.properties | 2 +- src/main/java/ru/betterend/blocks/FlamaeaBlock.java | 2 +- src/main/java/ru/betterend/interfaces/ISpetialItem.java | 7 ------- 3 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 src/main/java/ru/betterend/interfaces/ISpetialItem.java diff --git a/gradle.properties b/gradle.properties index a15787e2..85f2c954 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8.1-pre +mod_version = 0.9.8.2-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java index bba1a69d..03879d2f 100644 --- a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -18,8 +18,8 @@ import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import ru.bclib.interfaces.ISpetialItem; import ru.betterend.blocks.basis.EndPlantBlock; -import ru.betterend.interfaces.ISpetialItem; public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); diff --git a/src/main/java/ru/betterend/interfaces/ISpetialItem.java b/src/main/java/ru/betterend/interfaces/ISpetialItem.java deleted file mode 100644 index ef19bc36..00000000 --- a/src/main/java/ru/betterend/interfaces/ISpetialItem.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.betterend.interfaces; - -public interface ISpetialItem { - public int getStackSize(); - - public boolean canPlaceOnWater(); -} From bed07d2ad79afb6da9ca471ee1ea90edf8ccc759 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 12:16:54 +0300 Subject: [PATCH 3/8] Fixed missing caves in most biomes --- .../java/ru/betterend/registry/EndBiomes.java | 16 ++++------------ .../java/ru/betterend/world/biome/EndBiome.java | 12 ++++++++++-- .../world/generator/BetterEndBiomeSource.java | 3 ++- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index b39fd679..f3cdcbc9 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -61,7 +61,6 @@ import ru.betterend.world.generator.BiomeType; import ru.betterend.world.generator.GeneratorOptions; public class EndBiomes { - private static final Map ID_MAP = Maps.newHashMap(); public static final Set FABRIC_VOID = Sets.newHashSet(); private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); @@ -154,6 +153,7 @@ public class EndBiomes { hasCaves = JsonFactory.getBoolean(element.getAsJsonObject(), "has_caves", true); } EndBiome endBiome = new EndBiome(id, biome, fog, chance, hasCaves); + System.out.println("Added biome: " + endBiome); if (isVoid) { VOID_BIOMES.addBiomeMutable(endBiome); @@ -161,7 +161,7 @@ public class EndBiomes { else { LAND_BIOMES.addBiomeMutable(endBiome); } - ID_MAP.put(id, endBiome); + BiomeAPI.registerBiome(endBiome); } } } @@ -274,7 +274,7 @@ public class EndBiomes { parent.addSubBiome(endBiome); SUBBIOMES.add(endBiome); SUBBIOMES_UNMUTABLES.add(endBiome.getID()); - ID_MAP.put(endBiome.getID(), endBiome); + BiomeAPI.registerBiome(endBiome); } return endBiome; } @@ -291,7 +291,6 @@ public class EndBiomes { parent.addSubBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); - ID_MAP.put(biome.getID(), biome); BiomeAPI.addEndLandBiomeToFabricApi(biome); } return biome; @@ -307,7 +306,6 @@ public class EndBiomes { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); addToPicker(biome, type); - ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { BiomeAPI.addEndLandBiomeToFabricApi(biome); } @@ -328,7 +326,6 @@ public class EndBiomes { BiomeAPI.registerBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); - ID_MAP.put(biome.getID(), biome); BiomeAPI.addEndLandBiomeToFabricApi(biome); } return biome; @@ -341,7 +338,7 @@ public class EndBiomes { */ public static void addSubBiomeIntegration(EndBiome biome, ResourceLocation parent) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - EndBiome parentBiome = ID_MAP.get(parent); + BCLBiome parentBiome = BiomeAPI.getBiome(parent); if (parentBiome != null && !parentBiome.containsSubBiome(biome)) { parentBiome.addSubBiome(biome); } @@ -369,7 +366,6 @@ public class EndBiomes { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); CAVE_BIOMES.addBiome(biome); - ID_MAP.put(biome.getID(), biome); } return biome; } @@ -377,8 +373,4 @@ public class EndBiomes { public static EndCaveBiome getCaveBiome(int x, int z) { return (EndCaveBiome) caveBiomeMap.getBiome(x, z); } - - public static boolean hasBiome(ResourceLocation biomeID) { - return ID_MAP.containsKey(biomeID); - } } diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index e2c210b5..b0e33d89 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -5,14 +5,22 @@ import net.minecraft.world.level.biome.Biome; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.BCLBiomeDef; import ru.betterend.config.Configs; +import ru.betterend.registry.EndFeatures; public class EndBiome extends BCLBiome { - public EndBiome(BCLBiomeDef definition) { - super(definition.loadConfigValues(Configs.BIOME_CONFIG)); + public EndBiome(BCLBiomeDef def) { + super(updateDef(def)); + } public EndBiome(ResourceLocation id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { super(id, biome, fogDensity, genChance); this.addCustomData("has_caves", hasCaves); } + + private static BCLBiomeDef updateDef(BCLBiomeDef def) { + def.loadConfigValues(Configs.BIOME_CONFIG); + EndFeatures.addDefaultFeatures(def); + return def; + } } diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 602a095b..c5f81571 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -63,7 +63,8 @@ public class BetterEndBiomeSource extends BiomeSource { private static List getBiomes(Registry biomeRegistry) { List list = Lists.newArrayList(); biomeRegistry.forEach((biome) -> { - if (EndBiomes.hasBiome(biomeRegistry.getKey(biome))) { + BCLBiome bclBiome = BiomeAPI.getBiome(biomeRegistry.getKey(biome)); + if (bclBiome instanceof EndBiome) { list.add(biome); } }); From 684f3073ca4b836c3792429702f424df702a2000 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 12:25:26 +0300 Subject: [PATCH 4/8] Fixed missing cave population & tags --- .../java/ru/betterend/registry/EndBiomes.java | 1 - .../java/ru/betterend/registry/EndTags.java | 47 +++---------------- 2 files changed, 6 insertions(+), 42 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index f3cdcbc9..7dd8ee5f 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -153,7 +153,6 @@ public class EndBiomes { hasCaves = JsonFactory.getBoolean(element.getAsJsonObject(), "has_caves", true); } EndBiome endBiome = new EndBiome(id, biome, fog, chance, hasCaves); - System.out.println("Added biome: " + endBiome); if (isVoid) { VOID_BIOMES.addBiomeMutable(endBiome); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 7ce95c65..bcae1aff 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,20 +1,14 @@ package ru.betterend.registry; import java.util.List; -import java.util.function.Supplier; - import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; -import net.minecraft.tags.Tag.Named; -import net.minecraft.tags.TagCollection; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.world.level.biome.Biome; @@ -39,43 +33,12 @@ public class EndTags { // https://fabricmc.net/wiki/tutorial:tags // Block Tags - public static final Tag.Named PEDESTALS = makeBlockTag("pedestal"); - public static final Tag.Named END_STONES = makeCommonBlockTag("end_stones"); - public static final Tag.Named DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); + public static final Tag.Named PEDESTALS = TagAPI.makeBlockTag(BetterEnd.MOD_ID, "pedestal"); + public static final Tag.Named END_STONES = TagAPI.makeCommonBlockTag("end_stones"); + public static final Tag.Named DRAGON_IMMUNE = TagAPI.getMCBlockTag("dragon_immune"); // Item Tags - public final static Tag.Named HAMMERS = makeFabricItemTag("hammers"); - - public static Tag.Named makeTag(Supplier> containerSupplier, ResourceLocation id) { - Tag tag = containerSupplier.get().getTag(id); - return tag == null ? TagRegistry.create(id, containerSupplier) : (Named) tag; - } - - public static Tag.Named makeBlockTag(String name) { - return makeTag(BlockTags::getAllTags, BetterEnd.makeID(name)); - } - - public static Tag.Named makeItemTag(String name) { - return makeTag(ItemTags::getAllTags, BetterEnd.makeID(name)); - } - - public static Tag.Named makeCommonBlockTag(String name) { - return makeTag(BlockTags::getAllTags, new ResourceLocation("c", name)); - } - - public static Tag.Named makeCommonItemTag(String name) { - return makeTag(ItemTags::getAllTags, new ResourceLocation("c", name)); - } - - public static Tag.Named makeFabricItemTag(String name) { - return makeTag(ItemTags::getAllTags, new ResourceLocation("fabric", name)); - } - - public static Tag.Named getMCBlockTag(String name) { - ResourceLocation id = new ResourceLocation(name); - Tag tag = BlockTags.getAllTags().getTag(id); - return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; - } + public final static Tag.Named HAMMERS = TagAPI.makeItemTag("fabric", "hammers"); public static void register() { TagAPI.addEndGround(EndBlocks.THALLASIUM.ore); @@ -104,6 +67,8 @@ public class EndTags { ComposterBlockAccessor.callAdd(0.1F, block); } }); + TagAPI.addEndGround(EndBlocks.CAVE_MOSS); + TagHelper.addTag(BlockTags.NYLIUM, EndBlocks.CAVE_MOSS); BonemealAPI.addSpreadableBlock(EndBlocks.CAVE_MOSS); List hammers = Lists.newArrayList(); From 4dce2d5d7eebccb82a9e0fc55ba2fa056cbcd4d0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 12:46:52 +0300 Subject: [PATCH 5/8] Fix for caves breaking surface vertically --- gradle.properties | 2 +- .../terrain/caves/TunelCaveFeature.java | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 85f2c954..b169f1c8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8.2-pre +mod_version = 0.9.8.3-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index ed518538..cac45184 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -12,14 +12,17 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; +import ru.bclib.world.biomes.BCLBiome; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.cave.EndCaveBiome; @@ -43,17 +46,30 @@ public class TunelCaveFeature extends EndCaveFeature { Set positions = Sets.newHashSet(); MutableBlockPos pos = new MutableBlockPos(); + + float a = hasCaves(world, pos.set(x1, 0, z1)) ? 1F : 0F; + float b = hasCaves(world, pos.set(x2, 0, z1)) ? 1F : 0F; + float c = hasCaves(world, pos.set(x1, 0, z2)) ? 1F : 0F; + float d = hasCaves(world, pos.set(x2, 0, z2)) ? 1F : 0F; + for (int x = x1; x < x2; x++) { pos.setX(x); + float dx = (float) (x - x1) / 16F; + float da = Mth.lerp(dx, a, b); + float db = Mth.lerp(dx, c, d); for (int z = z1; z < z2; z++) { pos.setZ(z); + float dz = (float) (z - z1) / 16F; + float density = 1 - Mth.lerp(dz, da, db); + int wheight = world.getHeight(Types.WORLD_SURFACE_WG, x, z); for (int y = 0; y < y2; y++) { pos.setY(y); + float gradient = 1 - Mth.clamp((wheight - y) * 0.1F, 0F, 1F); float val = Mth.abs((float) noiseH.eval(x * 0.02, y * 0.01, z * 0.02)); float vert = Mth.sin((y + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F) * 0.9F; float dist = (float) noiseD.eval(x * 0.1, y * 0.1, z * 0.1) * 0.12F; - vert *= vert; - if (val + vert + dist < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { + val = (val + vert * vert + dist) + density + gradient; + if (val < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { BlocksHelper.setWithoutUpdate(world, pos, AIR); positions.add(pos.immutable()); int height = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); @@ -192,4 +208,17 @@ public class TunelCaveFeature extends EndCaveFeature { } }); } + + protected boolean hasCaves(WorldGenLevel world, BlockPos pos) { + return hasCavesInBiome(world, pos.offset(-8, 0, -8)) && + hasCavesInBiome(world, pos.offset(8, 0, -8)) && + hasCavesInBiome(world, pos.offset(-8, 0, 8)) && + hasCavesInBiome(world, pos.offset(8, 0, 8)); + } + + protected boolean hasCavesInBiome(WorldGenLevel world, BlockPos pos) { + Biome biome = world.getBiome(pos); + BCLBiome endBiome = BiomeAPI.getFromBiome(biome); + return endBiome.getCustomData("has_caves", true); + } } From 37394eba114387f59ca4242104cfaa26f6c3a0ba Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 21:38:56 +0300 Subject: [PATCH 6/8] Parallel cave generation & block fixing --- .../java/ru/betterend/util/BlockFixer.java | 328 +++++++++--------- .../terrain/caves/EndCaveFeature.java | 22 +- .../terrain/caves/RoundCaveFeature.java | 69 ++-- .../terrain/caves/TunelCaveFeature.java | 59 ++-- 4 files changed, 243 insertions(+), 235 deletions(-) diff --git a/src/main/java/ru/betterend/util/BlockFixer.java b/src/main/java/ru/betterend/util/BlockFixer.java index 9e9a0dcb..f0cdbc91 100644 --- a/src/main/java/ru/betterend/util/BlockFixer.java +++ b/src/main/java/ru/betterend/util/BlockFixer.java @@ -1,6 +1,7 @@ package ru.betterend.util; import java.util.Set; +import java.util.stream.IntStream; import com.google.common.collect.Sets; @@ -20,187 +21,194 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.registry.EndBlocks; public class BlockFixer { - private static final MutableBlockPos POS = new MutableBlockPos(); private static final BlockState AIR = Blocks.AIR.defaultBlockState(); private static final BlockState WATER = Blocks.WATER.defaultBlockState(); - + public static void fixBlocks(LevelAccessor world, BlockPos start, BlockPos end) { - BlockState state; - Set doubleCheck = Sets.newHashSet(); - for (int x = start.getX(); x <= end.getX(); x++) { - POS.setX(x); - for (int z = start.getZ(); z <= end.getZ(); z++) { - POS.setZ(z); - for (int y = start.getY(); y <= end.getY(); y++) { - POS.setY(y); - state = world.getBlockState(POS); - - if (state.getBlock() instanceof FurBlock) { - doubleCheck.add(POS.immutable()); - } - // Liquids - else if (!state.getFluidState().isEmpty()) { - if (!state.canSurvive(world, POS)) { - BlocksHelper.setWithoutUpdate(world, POS, WATER); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - while (!state.canSurvive(world, POS)) { - state = state.getFluidState().isEmpty() ? AIR : WATER; - BlocksHelper.setWithoutUpdate(world, POS, state); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - } - } - POS.setY(y - 1); - if (world.isEmptyBlock(POS)) { - POS.setY(y); - while (!world.getFluidState(POS).isEmpty()) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - } - continue; - } - for (Direction dir : BlocksHelper.HORIZONTAL) { - if (world.isEmptyBlock(POS.relative(dir))) { - world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); - break; - } - } - } - else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + Set doubleCheck = Sets.newConcurrentHashSet(); + int dx = end.getX() - start.getX() + 1; + int dz = end.getZ() - start.getZ() + 1; + int count = dx * dz; + IntStream.range(0, count).parallel().forEach(index -> { + MutableBlockPos POS = new MutableBlockPos(); + POS.setX((index % dx) + start.getX()); + POS.setZ((index / dx) + start.getZ()); + BlockState state; + for (int y = start.getY(); y <= end.getY(); y++) { + POS.setY(y); + state = world.getBlockState(POS); + + if (state.getBlock() instanceof FurBlock) { + doubleCheck.add(POS.immutable()); + } + // Liquids + else if (!state.getFluidState().isEmpty()) { + if (!state.canSurvive(world, POS)) { + setWithoutUpdate(world, POS, WATER); POS.setY(POS.getY() - 1); - if (world.isEmptyBlock(POS)) { + state = world.getBlockState(POS); + while (!state.canSurvive(world, POS)) { + state = state.getFluidState().isEmpty() ? AIR : WATER; + setWithoutUpdate(world, POS, state); + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + } + } + POS.setY(y - 1); + if (world.isEmptyBlock(POS)) { + POS.setY(y); + while (!world.getFluidState(POS).isEmpty()) { + setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); - while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); + } + continue; + } + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (world.isEmptyBlock(POS.relative(dir))) { + world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); + break; + } + } + } + else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + POS.setY(POS.getY() - 1); + if (world.isEmptyBlock(POS)) { + POS.setY(POS.getY() + 1); + while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + } + else if (state.getBlock() instanceof StalactiteBlock) { + if (!state.canSurvive(world, POS)) { + if (world.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); state = world.getBlockState(POS); } } - } - else if (state.getBlock() instanceof StalactiteBlock) { - if (!state.canSurvive(world, POS)) { - if (world.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { - while (state.getBlock() instanceof StalactiteBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - else { - while (state.getBlock() instanceof StalactiteBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - } - } - } - } - else if (state.is(EndBlocks.CAVE_PUMPKIN)) { - if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - } - } - else if (!state.canSurvive(world, POS)) { - // Chorus - if (state.is(Blocks.CHORUS_PLANT)) { - Set ends = Sets.newHashSet(); - Set add = Sets.newHashSet(); - ends.add(POS.immutable()); - - for (int i = 0; i < 64 && !ends.isEmpty(); i++) { - ends.forEach((pos) -> { - BlocksHelper.setWithoutUpdate(world, pos, AIR); - for (Direction dir : BlocksHelper.HORIZONTAL) { - BlockPos p = pos.relative(dir); - BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { - add.add(p); - } - } - BlockPos p = pos.above(); - BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { - add.add(p); - } - }); - ends.clear(); - ends.addAll(add); - add.clear(); - } - } - // Vines - else if (state.getBlock() instanceof BaseVineBlock) { - while (world.getBlockState(POS).getBlock() instanceof BaseVineBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() - 1); - } - } - // Falling blocks - else if (state.getBlock() instanceof FallingBlock) { - BlockState falling = state; - - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - - int ray = BlocksHelper.downRayRep(world, POS.immutable(), 64); - if (ray > 32) { - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); - if (world.getRandom().nextBoolean()) { - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); - } - } - else { - POS.setY(y); - BlockState replacement = AIR; - for (Direction dir : BlocksHelper.HORIZONTAL) { - state = world.getBlockState(POS.relative(dir)); - if (!state.getFluidState().isEmpty()) { - replacement = state; - break; - } - } - BlocksHelper.setWithoutUpdate(world, POS, replacement); - POS.setY(y - ray); - BlocksHelper.setWithoutUpdate(world, POS, falling); - } - } - // Blocks without support else { - // Blue Vine - if (state.getBlock() instanceof BlueVineBlock) { - while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is(EndBlocks.BLUE_VINE_FUR)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - // Double plants - if (state.getBlock() instanceof BaseDoublePlantBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - BlocksHelper.setWithoutUpdate(world, POS, AIR); - } - // Other blocks - else { - BlocksHelper.setWithoutUpdate(world, POS, getAirOrFluid(state)); + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); } } } } + else if (state.is(EndBlocks.CAVE_PUMPKIN)) { + if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { + setWithoutUpdate(world, POS, AIR); + } + } + else if (!state.canSurvive(world, POS)) { + // Chorus + if (state.is(Blocks.CHORUS_PLANT)) { + Set ends = Sets.newHashSet(); + Set add = Sets.newHashSet(); + ends.add(POS.immutable()); + + for (int i = 0; i < 64 && !ends.isEmpty(); i++) { + ends.forEach((pos) -> { + setWithoutUpdate(world, pos, AIR); + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlockPos p = pos.relative(dir); + BlockState st = world.getBlockState(p); + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { + add.add(p); + } + } + BlockPos p = pos.above(); + BlockState st = world.getBlockState(p); + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { + add.add(p); + } + }); + ends.clear(); + ends.addAll(add); + add.clear(); + } + } + // Vines + else if (state.getBlock() instanceof BaseVineBlock) { + while (world.getBlockState(POS).getBlock() instanceof BaseVineBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() - 1); + } + } + // Falling blocks + else if (state.getBlock() instanceof FallingBlock) { + BlockState falling = state; + + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + + int ray = BlocksHelper.downRayRep(world, POS.immutable(), 64); + if (ray > 32) { + setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); + if (world.getRandom().nextBoolean()) { + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); + } + } + else { + POS.setY(y); + BlockState replacement = AIR; + for (Direction dir : BlocksHelper.HORIZONTAL) { + state = world.getBlockState(POS.relative(dir)); + if (!state.getFluidState().isEmpty()) { + replacement = state; + break; + } + } + setWithoutUpdate(world, POS, replacement); + POS.setY(y - ray); + setWithoutUpdate(world, POS, falling); + } + } + // Blocks without support + else { + // Blue Vine + if (state.getBlock() instanceof BlueVineBlock) { + while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is(EndBlocks.BLUE_VINE_FUR)) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + // Double plants + if (state.getBlock() instanceof BaseDoublePlantBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + setWithoutUpdate(world, POS, AIR); + } + // Other blocks + else { + setWithoutUpdate(world, POS, getAirOrFluid(state)); + } + } + } } - } - + }); + doubleCheck.forEach((pos) -> { if (!world.getBlockState(pos).canSurvive(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); + setWithoutUpdate(world, pos, AIR); } }); } - + private static BlockState getAirOrFluid(BlockState state) { return state.getFluidState().isEmpty() ? AIR : state.getFluidState().createLegacyBlock(); } + + private static void setWithoutUpdate(LevelAccessor world, BlockPos pos, BlockState state) { + synchronized (world) { + BlocksHelper.setWithoutUpdate(world, pos, state); + } + } } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java index 964fa6b3..61abf3ce 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -58,19 +58,17 @@ public abstract class EndCaveFeature extends DefaultFeature { if (!caveBlocks.isEmpty()) { if (biome != null) { setBiomes(world, biome, caveBlocks); - Set floorPositions = Sets.newHashSet(); - Set ceilPositions = Sets.newHashSet(); - MutableBlockPos mut = new MutableBlockPos(); - caveBlocks.forEach((bpos) -> { - mut.set(bpos); - if (world.getBlockState(mut).getMaterial().isReplaceable()) { - mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { - floorPositions.add(mut.immutable()); + Set floorPositions = Sets.newConcurrentHashSet(); + Set ceilPositions = Sets.newConcurrentHashSet(); + caveBlocks.parallelStream().forEach((bpos) -> { + if (world.getBlockState(bpos).getMaterial().isReplaceable()) { + BlockPos side = bpos.below(); + if (world.getBlockState(side).is(TagAPI.GEN_TERRAIN)) { + floorPositions.add(side); } - mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { - ceilPositions.add(mut.immutable()); + side = bpos.above(); + if (world.getBlockState(side).is(TagAPI.GEN_TERRAIN)) { + ceilPositions.add(side); } } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java index 58364bd6..05d2179f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java @@ -2,6 +2,7 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; +import java.util.stream.IntStream; import com.google.common.collect.Sets; @@ -30,47 +31,45 @@ public class RoundCaveFeature extends EndCaveFeature { double hr = radius * 0.75; double nr = radius * 0.25; - BlockState state; - MutableBlockPos bpos = new MutableBlockPos(); - Set blocks = Sets.newHashSet(); - for (int x = x1; x <= x2; x++) { - int xsq = x - center.getX(); - xsq *= xsq; + int dx = x2 - x1 + 1; + int dz = z2 - z1 + 1; + int count = dx * dz; + Set blocks = Sets.newConcurrentHashSet(); + IntStream.range(0, count).parallel().forEach(index -> { + MutableBlockPos bpos = new MutableBlockPos(); + int x = (index % dx) + x1; + int z = (index / dx) + z1; bpos.setX(x); - for (int z = z1; z <= z2; z++) { - int zsq = z - center.getZ(); - zsq *= zsq; - bpos.setZ(z); - for (int y = y1; y <= y2; y++) { - int ysq = y - center.getY(); - ysq *= 1.6; - ysq *= ysq; + bpos.setZ(z); + int xsq = MHelper.sqr(x - center.getX()); + int zsq = MHelper.sqr(z - center.getZ()); + int dxz = xsq + zsq; + BlockState state; + for (int y = y1; y <= y2; y++) { + int ysq = (int) MHelper.sqr((y - center.getY()) * 1.6); + double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; + double dist = dxz + ysq; + if (dist < r * r) { bpos.setY(y); - double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; - double dist = xsq + ysq + zsq; - if (dist < r * r) { - state = world.getBlockState(bpos); - if (isReplaceable(state) && !isWaterNear(world, bpos)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - blocks.add(bpos.immutable()); - - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() + 1); - state = world.getBlockState(bpos); - } - - bpos.setY(y - 1); - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() - 1); - state = world.getBlockState(bpos); - } + state = world.getBlockState(bpos); + if (isReplaceable(state) && !isWaterNear(world, bpos)) { + blocks.add(bpos.immutable()); + + while (state.getMaterial().equals(Material.LEAVES)) { + bpos.setY(bpos.getY() + 1); + state = world.getBlockState(bpos); + } + + bpos.setY(y - 1); + while (state.getMaterial().equals(Material.LEAVES)) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); } } } } - } + }); + blocks.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); return blocks; } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index cac45184..24cbea5a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -3,6 +3,7 @@ package ru.betterend.world.features.terrain.caves; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.stream.IntStream; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -15,6 +16,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.Feature; @@ -34,55 +36,56 @@ public class TunelCaveFeature extends EndCaveFeature { if ((long) cx * (long) cx + (long) cz + (long) cz < 256) { return Sets.newHashSet(); } + int x1 = cx << 4; int z1 = cz << 4; int x2 = x1 + 16; int z2 = z1 + 16; - int y2 = world.getHeight(); + Random rand = new Random(world.getSeed()); OpenSimplexNoise noiseH = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseV = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseD = new OpenSimplexNoise(rand.nextInt()); - Set positions = Sets.newHashSet(); - MutableBlockPos pos = new MutableBlockPos(); + Set positions = Sets.newConcurrentHashSet(); - float a = hasCaves(world, pos.set(x1, 0, z1)) ? 1F : 0F; - float b = hasCaves(world, pos.set(x2, 0, z1)) ? 1F : 0F; - float c = hasCaves(world, pos.set(x1, 0, z2)) ? 1F : 0F; - float d = hasCaves(world, pos.set(x2, 0, z2)) ? 1F : 0F; + float a = hasCaves(world, new BlockPos(x1, 0, z1)) ? 1F : 0F; + float b = hasCaves(world, new BlockPos(x2, 0, z1)) ? 1F : 0F; + float c = hasCaves(world, new BlockPos(x1, 0, z2)) ? 1F : 0F; + float d = hasCaves(world, new BlockPos(x2, 0, z2)) ? 1F : 0F; - for (int x = x1; x < x2; x++) { - pos.setX(x); - float dx = (float) (x - x1) / 16F; + ChunkAccess chunk = world.getChunk(cx, cz); + IntStream.range(0, 256).parallel().forEach(index -> { + MutableBlockPos pos = new MutableBlockPos(); + int x = index & 15; + int z = index >> 4; + int wheight = chunk.getHeight(Types.WORLD_SURFACE_WG, x, z); + float dx = x / 16F; + float dz = z / 16F; + pos.setX(x + x1); + pos.setZ(z + z1); float da = Mth.lerp(dx, a, b); float db = Mth.lerp(dx, c, d); - for (int z = z1; z < z2; z++) { - pos.setZ(z); - float dz = (float) (z - z1) / 16F; - float density = 1 - Mth.lerp(dz, da, db); - int wheight = world.getHeight(Types.WORLD_SURFACE_WG, x, z); - for (int y = 0; y < y2; y++) { + float density = 1 - Mth.lerp(dz, da, db); + if (density < 0.5) { + for (int y = 0; y < wheight; y++) { pos.setY(y); float gradient = 1 - Mth.clamp((wheight - y) * 0.1F, 0F, 1F); - float val = Mth.abs((float) noiseH.eval(x * 0.02, y * 0.01, z * 0.02)); - float vert = Mth.sin((y + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F) * 0.9F; - float dist = (float) noiseD.eval(x * 0.1, y * 0.1, z * 0.1) * 0.12F; + if (gradient > 0.5) { + break; + } + float val = Mth.abs((float) noiseH.eval(pos.getX() * 0.02, y * 0.01, pos.getZ() * 0.02)); + float vert = Mth.sin((y + (float) noiseV.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * 20) * 0.1F) * 0.9F; + float dist = (float) noiseD.eval(pos.getX() * 0.1, y * 0.1, pos.getZ() * 0.1) * 0.12F; val = (val + vert * vert + dist) + density + gradient; if (val < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); positions.add(pos.immutable()); - int height = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (height < pos.getY() + 4) { - while (pos.getY() < height && noWaterNear(world, pos)) { - pos.setY(pos.getY() + 1); - BlocksHelper.setWithoutUpdate(world, pos, AIR); - } - } } } } - } + }); + positions.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); + return positions; } From 262b2496549b1034cdc447ad78343de778b67010 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 21:52:05 +0300 Subject: [PATCH 7/8] Version change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b169f1c8..012f8840 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8.3-pre +mod_version = 0.9.8.4-pre maven_group = ru.betterend archives_base_name = better-end From 30204a2aeeecb051c33129a0bcb1c562b293c76d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 22 Jun 2021 13:32:44 +0300 Subject: [PATCH 8/8] Wrong chest registry fix --- gradle.properties | 2 +- src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 012f8840..7c15972e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8.4-pre +mod_version = 0.9.8.5-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index c42dc9e9..57df31f3 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -16,6 +16,7 @@ import ru.bclib.blocks.BaseBarkBlock; import ru.bclib.blocks.BaseBarrelBlock; import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BaseBookshelfBlock; +import ru.bclib.blocks.BaseChestBlock; import ru.bclib.blocks.BaseComposterBlock; import ru.bclib.blocks.BaseCraftingTableBlock; import ru.bclib.blocks.BaseDoorBlock; @@ -90,7 +91,7 @@ public class WoodenMaterial { ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks)); sign = EndBlocks.registerBlock(name + "_sign", new BaseSignBlock(planks)); - chest = EndBlocks.registerBlock(name + "_chest", new BaseFenceBlock(planks)); + chest = EndBlocks.registerBlock(name + "_chest", new BaseChestBlock(planks)); barrel = EndBlocks.registerBlock(name + "_barrel", new BaseBarrelBlock(planks)); shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks)); composter = EndBlocks.registerBlock(name + "_composter", new BaseComposterBlock(planks));