From 6221600775423a678a20bc18d67a29fc33509459 Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Fri, 14 Oct 2022 22:55:12 +0200 Subject: [PATCH 01/13] [Feature] Renewable smaragdant --- .../blocks/BuddingSmaragdantCrystalBlock.java | 66 ++++++++++++++++++ .../betterx/betterend/registry/EndBlocks.java | 1 + .../terrain/SmaragdantCrystalFeature.java | 27 ++++++- .../assets/betterend/lang/en_us.json | 1 + .../block/budding_smaragdant_crystal.json | 12 ++++ .../item/budding_smaragdant_crystal.json | 3 + .../block/budding_smaragdant_crystal_side.png | Bin 0 -> 264 bytes .../block/budding_smaragdant_crystal_top.png | Bin 0 -> 268 bytes 8 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java create mode 100644 src/main/resources/assets/betterend/models/block/budding_smaragdant_crystal.json create mode 100644 src/main/resources/assets/betterend/models/item/budding_smaragdant_crystal.json create mode 100644 src/main/resources/assets/betterend/textures/block/budding_smaragdant_crystal_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/budding_smaragdant_crystal_top.png diff --git a/src/main/java/org/betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java b/src/main/java/org/betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java new file mode 100644 index 00000000..728b9d43 --- /dev/null +++ b/src/main/java/org/betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java @@ -0,0 +1,66 @@ +package org.betterx.betterend.blocks; + +import org.betterx.bclib.interfaces.tools.AddMineablePickaxe; +import org.betterx.bclib.util.BlocksHelper; +import org.betterx.betterend.blocks.basis.LitPillarBlock; +import org.betterx.betterend.registry.EndBlocks; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.level.storage.loot.LootContext; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; + +import java.util.Collections; +import java.util.List; + +public class BuddingSmaragdantCrystalBlock extends LitPillarBlock implements AddMineablePickaxe { + public BuddingSmaragdantCrystalBlock() { + super(FabricBlockSettings.of(Material.GLASS) + .luminance(15) + .hardness(1F) + .resistance(1F) + .noOcclusion() + .sound(SoundType.AMETHYST) + .randomTicks()); + } + + @Override + public PushReaction getPistonPushReaction(BlockState blockState) { + return PushReaction.DESTROY; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.emptyList(); + } + + @SuppressWarnings("deprecation") + @Override + public void randomTick(BlockState blockState, ServerLevel world, BlockPos pos, RandomSource random) { + Direction dir = BlocksHelper.randomDirection(random); + BlockPos side = pos.relative(dir); + BlockState sideState = world.getBlockState(side); + if (random.nextInt(5) == 0) { + if (canShardGrowAtState(sideState)) { + BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.defaultBlockState() + .setValue(SmaragdantCrystalShardBlock.WATERLOGGED, sideState.getFluidState().getType() == Fluids.WATER) + .setValue(SmaragdantCrystalShardBlock.FACING, dir); + world.setBlockAndUpdate(side, shard); + } + } + } + + public static boolean canShardGrowAtState(BlockState blockState) { + return blockState.isAir() || blockState.is(Blocks.WATER) && blockState.getFluidState().getAmount() == 8; + } +} diff --git a/src/main/java/org/betterx/betterend/registry/EndBlocks.java b/src/main/java/org/betterx/betterend/registry/EndBlocks.java index 46387888..a84481d0 100644 --- a/src/main/java/org/betterx/betterend/registry/EndBlocks.java +++ b/src/main/java/org/betterx/betterend/registry/EndBlocks.java @@ -571,6 +571,7 @@ public class EndBlocks { "smaragdant_crystal", SMARAGDANT_CRYSTAL ); + public static final Block BUDDING_SMARAGDANT_CRYSTAL = registerBlock("budding_smaragdant_crystal", new BuddingSmaragdantCrystalBlock()); public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); diff --git a/src/main/java/org/betterx/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/org/betterx/betterend/world/features/terrain/SmaragdantCrystalFeature.java index 0b7acfd2..b19b9dd4 100644 --- a/src/main/java/org/betterx/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/org/betterx/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -3,6 +3,8 @@ package org.betterx.betterend.world.features.terrain; import org.betterx.bclib.api.v2.levelgen.features.features.DefaultFeature; import org.betterx.bclib.util.BlocksHelper; import org.betterx.bclib.util.MHelper; +import org.betterx.betterend.blocks.BuddingSmaragdantCrystalBlock; +import org.betterx.betterend.blocks.SmaragdantCrystalShardBlock; import org.betterx.betterend.registry.EndBlocks; import org.betterx.worlds.together.tag.v3.CommonBlockTags; @@ -14,6 +16,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.core.Direction; +import net.minecraft.world.level.material.Fluids; public class SmaragdantCrystalFeature extends DefaultFeature { @Override @@ -29,6 +33,7 @@ public class SmaragdantCrystalFeature extends DefaultFeature { int count = MHelper.randRange(15, 30, random); BlockState crystal = EndBlocks.SMARAGDANT_CRYSTAL.defaultBlockState(); BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.defaultBlockState(); + BlockState buddingCrystal = EndBlocks.BUDDING_SMARAGDANT_CRYSTAL.defaultBlockState(); for (int i = 0; i < count; i++) { mut.set(pos) .move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, MHelper.floor(random.nextGaussian() * 2 + 0.5)); @@ -42,10 +47,26 @@ public class SmaragdantCrystalFeature extends DefaultFeature { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.is(CommonBlockTags.GEN_END_STONES) && !world.getBlockState(mut.above()) - .is(crystal.getBlock())) { + if (state.is(CommonBlockTags.GEN_END_STONES) && world.getBlockState(mut.above()).isAir()) { for (int j = 0; j <= dist; j++) { - BlocksHelper.setWithoutUpdate(world, mut, crystal); + if (random.nextInt(5) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, buddingCrystal); + for (Direction k : BlocksHelper.HORIZONTAL) { + BlockPos sidePos = mut.relative(k); + BlockState sideState = world.getBlockState(sidePos); + if (BuddingSmaragdantCrystalBlock.canShardGrowAtState(sideState)) { + if (random.nextBoolean()) { + BlockState attachedShard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.defaultBlockState() + .setValue(SmaragdantCrystalShardBlock.WATERLOGGED, + sideState.getFluidState().getType() == Fluids.WATER) + .setValue(SmaragdantCrystalShardBlock.FACING, k); + BlocksHelper.setWithoutUpdate(world, sidePos, attachedShard); + } + } + } + } else { + BlocksHelper.setWithoutUpdate(world, mut, crystal); + } mut.setY(mut.getY() + 1); } boolean waterlogged = !world.getFluidState(mut).isEmpty(); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index b8cc095e..117e519b 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -670,6 +670,7 @@ "block.betterend.sandy_jadestone_tiles": "Sandy Jadestone Tiles", "block.betterend.sandy_jadestone_wall": "Sandy Jadestone Wall", "block.betterend.smaragdant_crystal": "Smaragdant Crystal", + "block.betterend.budding_smaragdant_crystal": "Budding Smaragdant Crystal", "block.betterend.smaragdant_crystal_shard": "Smaragdant Crystal Shard", "block.betterend.virid_jadestone": "Virid Jadestone", "block.betterend.virid_jadestone_bricks": "Virid Jadestone Bricks", diff --git a/src/main/resources/assets/betterend/models/block/budding_smaragdant_crystal.json b/src/main/resources/assets/betterend/models/block/budding_smaragdant_crystal.json new file mode 100644 index 00000000..9d9d166a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/budding_smaragdant_crystal.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "betterend:block/budding_smaragdant_crystal_top", + "east": "betterend:block/budding_smaragdant_crystal_side", + "north": "betterend:block/budding_smaragdant_crystal_side", + "particle": "betterend:block/budding_smaragdant_crystal_side", + "south": "betterend:block/budding_smaragdant_crystal_side", + "up": "betterend:block/budding_smaragdant_crystal_top", + "west": "betterend:block/budding_smaragdant_crystal_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/budding_smaragdant_crystal.json b/src/main/resources/assets/betterend/models/item/budding_smaragdant_crystal.json new file mode 100644 index 00000000..d7bedef9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/budding_smaragdant_crystal.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/budding_smaragdant_crystal" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/budding_smaragdant_crystal_side.png b/src/main/resources/assets/betterend/textures/block/budding_smaragdant_crystal_side.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4af8605e8bff84b2d3824aa1bf97442c0d5170 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFwt2vrF%-J_l65S>O>_%)r2R7=#&* z=dVZs3f6eKIEF}E<~_Gj@UQ|;Ya(M&zs!r=`4S4{e)=_1496>)CcLqCx>9?#{(WO~ z*-rnYf_FVdQ&MBb@ E09FZKjsO4v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/budding_smaragdant_crystal_top.png b/src/main/resources/assets/betterend/textures/block/budding_smaragdant_crystal_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6f249155a4eab435a83bb4660b141e68d1e2bbfe GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO>_%)r2R7=#&* z=dVZs3O0DUIEF}E<~_Za?~sBB+XeoOb2&3-{PeU+E>2a8Ih2!Ca4hWpf6*^**bfEO zIOGT1f3tj__!nKx>N!15m0S~T!%qHMkfOlG8OqJD_lehyi}B`3&gDNC&(*M;xEbnY zaN>Qo^UpHdQ;qqnHO`aDTx(d*aSyqf0!J>Ge-u1` Date: Fri, 14 Oct 2022 23:58:33 +0200 Subject: [PATCH 02/13] Tweaked some values --- .../betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java | 2 +- .../world/features/terrain/SmaragdantCrystalFeature.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java b/src/main/java/org/betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java index 728b9d43..e4a99d11 100644 --- a/src/main/java/org/betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java +++ b/src/main/java/org/betterx/betterend/blocks/BuddingSmaragdantCrystalBlock.java @@ -50,7 +50,7 @@ public class BuddingSmaragdantCrystalBlock extends LitPillarBlock implements Add Direction dir = BlocksHelper.randomDirection(random); BlockPos side = pos.relative(dir); BlockState sideState = world.getBlockState(side); - if (random.nextInt(5) == 0) { + if (random.nextInt(20) == 0) { if (canShardGrowAtState(sideState)) { BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.defaultBlockState() .setValue(SmaragdantCrystalShardBlock.WATERLOGGED, sideState.getFluidState().getType() == Fluids.WATER) diff --git a/src/main/java/org/betterx/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/org/betterx/betterend/world/features/terrain/SmaragdantCrystalFeature.java index b19b9dd4..ed3170d7 100644 --- a/src/main/java/org/betterx/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/org/betterx/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -49,7 +49,7 @@ public class SmaragdantCrystalFeature extends DefaultFeature { } if (state.is(CommonBlockTags.GEN_END_STONES) && world.getBlockState(mut.above()).isAir()) { for (int j = 0; j <= dist; j++) { - if (random.nextInt(5) == 0) { + if (random.nextInt(8) == 0) { BlocksHelper.setWithoutUpdate(world, mut, buddingCrystal); for (Direction k : BlocksHelper.HORIZONTAL) { BlockPos sidePos = mut.relative(k); From 83e92df64cb01cd31ee4512c460dba18f760cbdb Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Tue, 18 Oct 2022 23:56:21 +0200 Subject: [PATCH 03/13] [Feature] End fishing loot tables. Fixes quiqueck/BetterEnd#79 --- .../betterx/betterend/registry/EndTags.java | 2 + .../betterx/betterend/util/LootTableUtil.java | 108 +++++++++++++++++- .../loot_tables/gameplay/fishing/fish.json | 4 + .../loot_tables/gameplay/fishing/junk.json | 4 + .../gameplay/fishing/treasure.json | 4 + 5 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/data/betterend/loot_tables/gameplay/fishing/fish.json create mode 100644 src/main/resources/data/betterend/loot_tables/gameplay/fishing/junk.json create mode 100644 src/main/resources/data/betterend/loot_tables/gameplay/fishing/treasure.json diff --git a/src/main/java/org/betterx/betterend/registry/EndTags.java b/src/main/java/org/betterx/betterend/registry/EndTags.java index 9c6f0c28..aed4c6df 100644 --- a/src/main/java/org/betterx/betterend/registry/EndTags.java +++ b/src/main/java/org/betterx/betterend/registry/EndTags.java @@ -125,6 +125,8 @@ public class EndTags { TagManager.ITEMS.add(ALLOYING_IRON, Items.IRON_ORE, Items.DEEPSLATE_IRON_ORE, Items.RAW_IRON); TagManager.ITEMS.add(ALLOYING_GOLD, Items.GOLD_ORE, Items.DEEPSLATE_GOLD_ORE, Items.RAW_GOLD); TagManager.ITEMS.add(ALLOYING_COPPER, Items.COPPER_ORE, Items.DEEPSLATE_COPPER_ORE, Items.RAW_COPPER); + + TagManager.ITEMS.add(ItemTags.FISHES, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); } public static void addEndGround(Block bl) { diff --git a/src/main/java/org/betterx/betterend/util/LootTableUtil.java b/src/main/java/org/betterx/betterend/util/LootTableUtil.java index 1fcd0861..ef33521b 100644 --- a/src/main/java/org/betterx/betterend/util/LootTableUtil.java +++ b/src/main/java/org/betterx/betterend/util/LootTableUtil.java @@ -1,6 +1,20 @@ package org.betterx.betterend.util; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.FishingHookPredicate; +import net.minecraft.advancements.critereon.LocationPredicate; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.loot.BuiltInLootTables; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.entries.*; +import net.minecraft.world.level.storage.loot.functions.EnchantWithLevelsFunction; +import net.minecraft.world.level.storage.loot.functions.SetItemDamageFunction; +import net.minecraft.world.level.storage.loot.predicates.LocationCheck; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemEntityPropertyCondition; +import org.betterx.bclib.BCLib; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome; +import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; import org.betterx.bclib.complexmaterials.WoodenComplexMaterial; import org.betterx.betterend.BetterEnd; @@ -15,12 +29,12 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import net.fabricmc.fabric.api.loot.v2.LootTableEvents; +import org.betterx.betterend.world.biome.EndBiome; public class LootTableUtil { private static final ResourceLocation END_CITY_TREASURE_ID = new ResourceLocation("chests/end_city_treasure"); @@ -30,6 +44,34 @@ public class LootTableUtil { private static final ResourceLocation SHADOW_FOREST = BetterEnd.makeID("chests/shadow_forest"); private static final ResourceLocation LANTERN_WOODS = BetterEnd.makeID("chests/lantern_woods"); private static final ResourceLocation UMBRELLA_JUNGLE = BetterEnd.makeID("chests/umbrella_jungle"); + private static final ResourceLocation FISHING_FISH = BetterEnd.makeID("gameplay/fishing/fish"); + private static final ResourceLocation FISHING_TREASURE = BetterEnd.makeID("gameplay/fishing/treasure"); + private static final ResourceLocation FISHING_JUNK = BetterEnd.makeID("gameplay/fishing/junk"); + + private static final LootItemCondition.Builder IN_END + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setDimension(Level.END)); + private static final LootItemCondition.Builder IN_FOGGY_MUSHROOMLAND + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.FOGGY_MUSHROOMLAND.getBiomeKey())); + private static final LootItemCondition.Builder IN_CHORUS_FOREST + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.CHORUS_FOREST.getBiomeKey())); + private static final LootItemCondition.Builder IN_AMBER_LAND + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.AMBER_LAND.getBiomeKey())); + private static final LootItemCondition.Builder IN_GLOWING_GRASSLANDS + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.GLOWING_GRASSLANDS.getBiomeKey())); + private static final LootItemCondition.Builder IN_LANTERN_WOODS + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.LANTERN_WOODS.getBiomeKey())); + private static final LootItemCondition.Builder IN_MEGALAKE + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.MEGALAKE.getBiomeKey())); + private static final LootItemCondition.Builder IN_MEGALAKE_GROVE + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.MEGALAKE_GROVE.getBiomeKey())); + private static final LootItemCondition.Builder IN_NEON_OASIS + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.NEON_OASIS.getBiomeKey())); + private static final LootItemCondition.Builder IN_SHADOW_FOREST + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.SHADOW_FOREST.getBiomeKey())); + private static final LootItemCondition.Builder IN_SULPHUR_SPRINGS + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.SULPHUR_SPRINGS.getBiomeKey())); + private static final LootItemCondition.Builder IN_UMBRELLA_JUNGLE + = LocationCheck.checkLocation(LocationPredicate.Builder.location().setBiome(EndBiomes.UMBRELLA_JUNGLE.getBiomeKey())); public static void init() { LootTableEvents.MODIFY.register((resourceManager, lootManager, id, table, setter) -> { @@ -48,6 +90,37 @@ public class LootTableUtil { builder.add(LootItem.lootTableItem(EndItems.MUSIC_DISC_EO_DRACONA)); table.withPool(builder); } else if (id.getNamespace().equals(BetterEnd.MOD_ID)) { + if (FISHING_FISH.equals(id)) { + LootPool.Builder builder = LootPool.lootPool() + .add(LootItem.lootTableItem(EndItems.END_FISH_RAW)); + table.withPool(builder); + return; + } else if (FISHING_JUNK.equals(id)) { + LootPool.Builder builder = LootPool.lootPool() + .add(LootItem.lootTableItem(EndItems.END_LILY_LEAF)) + .add(LootItem.lootTableItem(Items.ENDER_PEARL)) + .add(LootItem.lootTableItem(Items.CHORUS_FRUIT)) + .add(LootItem.lootTableItem(EndItems.GELATINE)) + .add(LootItem.lootTableItem(EndItems.CRYSTAL_SHARDS)); + addCharnia(builder); + table.withPool(builder); + return; + } else if (FISHING_TREASURE.equals(id)) { + LootPool.Builder builder = LootPool.lootPool() + .add(LootItem.lootTableItem(EndItems.AETERNIUM_SWORD_BLADE)) + .add(LootItem.lootTableItem(EndItems.AETERNIUM_FORGED_PLATE)) + .add(LootItem.lootTableItem(EndBlocks.MENGER_SPONGE)) + .add(LootItem.lootTableItem(Items.BOW) + .apply(SetItemDamageFunction.setDamage(UniformGenerator.between(0.0F, 0.25F))) + .apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30.0F)).allowTreasure())) + .add(LootItem.lootTableItem(Items.FISHING_ROD) + .apply(SetItemDamageFunction.setDamage(UniformGenerator.between(0.0F, 0.25F))) + .apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30.0F)).allowTreasure())) + .add(LootItem.lootTableItem(Items.BOOK) + .apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30.0F)).allowTreasure())); + table.withPool(builder); + return; + } addCommonItems(table); if (FOGGY_MUSHROOMLAND.equals(id)) { LootPool.Builder builder = LootPool.lootPool(); @@ -88,6 +161,24 @@ public class LootTableUtil { } } }); + + LootTableEvents.REPLACE.register((resourceManager, lootManager, id, originalTable, setter) -> { + if (BuiltInLootTables.FISHING.equals(id)) { + LootTable.Builder builder = LootTable.lootTable() + .withPool(LootPool.lootPool().when(IN_END.invert()).setRolls(ConstantValue.exactly(1.0F)) + .add(LootTableReference.lootTableReference(BuiltInLootTables.FISHING_JUNK).setWeight(10).setQuality(-2)) + .add(LootTableReference.lootTableReference(BuiltInLootTables.FISHING_TREASURE).setWeight(5).setQuality(2) + .when(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, + EntityPredicate.Builder.entity().subPredicate(FishingHookPredicate.inOpenWater(true))))) + .add(LootTableReference.lootTableReference(BuiltInLootTables.FISHING_FISH).setWeight(85).setQuality(-1))) + .withPool(LootPool.lootPool().when(IN_END).setRolls(ConstantValue.exactly(1.0F)) + .add(LootTableReference.lootTableReference(FISHING_FISH).setWeight(85).setQuality(-1)) + .add(LootTableReference.lootTableReference(FISHING_TREASURE).setWeight(5).setQuality(2)) + .add(LootTableReference.lootTableReference(FISHING_JUNK).setWeight(10).setQuality(-2))); + return builder.build(); + } + return null; + }); } public static ResourceLocation getTable(Holder biome) { @@ -106,6 +197,21 @@ public class LootTableUtil { return COMMON; } + private static void addCharnia(LootPool.Builder pool) { + pool.add(LootItem.lootTableItem(EndBlocks.CHARNIA_CYAN) + .when(IN_GLOWING_GRASSLANDS.or(IN_MEGALAKE).or(IN_MEGALAKE_GROVE).or(IN_NEON_OASIS))); + pool.add(LootItem.lootTableItem(EndBlocks.CHARNIA_LIGHT_BLUE) + .when(IN_FOGGY_MUSHROOMLAND.or(IN_GLOWING_GRASSLANDS).or(IN_MEGALAKE).or(IN_MEGALAKE_GROVE).or(IN_UMBRELLA_JUNGLE))); + pool.add(LootItem.lootTableItem(EndBlocks.CHARNIA_GREEN) + .when(IN_GLOWING_GRASSLANDS.or(IN_NEON_OASIS).or(IN_SULPHUR_SPRINGS).or(IN_UMBRELLA_JUNGLE))); + pool.add(LootItem.lootTableItem(EndBlocks.CHARNIA_RED) + .when(IN_AMBER_LAND.or(IN_LANTERN_WOODS).or(IN_NEON_OASIS))); + pool.add(LootItem.lootTableItem(EndBlocks.CHARNIA_ORANGE) + .when(IN_AMBER_LAND.or(IN_LANTERN_WOODS).or(IN_SULPHUR_SPRINGS))); + pool.add(LootItem.lootTableItem(EndBlocks.CHARNIA_PURPLE) + .when(IN_CHORUS_FOREST.or(IN_SHADOW_FOREST))); + } + private static void addCommonItems(LootTable.Builder table) { LootPool.Builder builder = LootPool.lootPool(); builder.setRolls(UniformGenerator.between(0, 2)); diff --git a/src/main/resources/data/betterend/loot_tables/gameplay/fishing/fish.json b/src/main/resources/data/betterend/loot_tables/gameplay/fishing/fish.json new file mode 100644 index 00000000..16cac10a --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/gameplay/fishing/fish.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:fishing", + "pools": [] +} diff --git a/src/main/resources/data/betterend/loot_tables/gameplay/fishing/junk.json b/src/main/resources/data/betterend/loot_tables/gameplay/fishing/junk.json new file mode 100644 index 00000000..16cac10a --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/gameplay/fishing/junk.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:fishing", + "pools": [] +} diff --git a/src/main/resources/data/betterend/loot_tables/gameplay/fishing/treasure.json b/src/main/resources/data/betterend/loot_tables/gameplay/fishing/treasure.json new file mode 100644 index 00000000..16cac10a --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/gameplay/fishing/treasure.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:fishing", + "pools": [] +} From 64993b395e0cf59aa6a560a2158651a7d2b3d1e7 Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Tue, 18 Oct 2022 23:58:10 +0200 Subject: [PATCH 04/13] Remove unused imports --- src/main/java/org/betterx/betterend/util/LootTableUtil.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/betterx/betterend/util/LootTableUtil.java b/src/main/java/org/betterx/betterend/util/LootTableUtil.java index ef33521b..4a163bfa 100644 --- a/src/main/java/org/betterx/betterend/util/LootTableUtil.java +++ b/src/main/java/org/betterx/betterend/util/LootTableUtil.java @@ -12,9 +12,7 @@ import net.minecraft.world.level.storage.loot.functions.SetItemDamageFunction; import net.minecraft.world.level.storage.loot.predicates.LocationCheck; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.predicates.LootItemEntityPropertyCondition; -import org.betterx.bclib.BCLib; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome; -import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; import org.betterx.bclib.complexmaterials.WoodenComplexMaterial; import org.betterx.betterend.BetterEnd; @@ -34,7 +32,6 @@ import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import net.fabricmc.fabric.api.loot.v2.LootTableEvents; -import org.betterx.betterend.world.biome.EndBiome; public class LootTableUtil { private static final ResourceLocation END_CITY_TREASURE_ID = new ResourceLocation("chests/end_city_treasure"); From 70eb63308375d59f9945fd38d000a305a034c172 Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Wed, 19 Oct 2022 00:00:49 +0200 Subject: [PATCH 05/13] Avoid star import --- src/main/java/org/betterx/betterend/util/LootTableUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/betterx/betterend/util/LootTableUtil.java b/src/main/java/org/betterx/betterend/util/LootTableUtil.java index 4a163bfa..c9fd1c8b 100644 --- a/src/main/java/org/betterx/betterend/util/LootTableUtil.java +++ b/src/main/java/org/betterx/betterend/util/LootTableUtil.java @@ -6,7 +6,8 @@ import net.minecraft.advancements.critereon.LocationPredicate; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.entries.*; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.entries.LootTableReference; import net.minecraft.world.level.storage.loot.functions.EnchantWithLevelsFunction; import net.minecraft.world.level.storage.loot.functions.SetItemDamageFunction; import net.minecraft.world.level.storage.loot.predicates.LocationCheck; From e72d87e6455d907e63f1ef88de25174005ce0c7f Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Thu, 20 Oct 2022 04:33:40 +0200 Subject: [PATCH 06/13] Don't reset vanilla fishing tables to default --- build.gradle | 2 +- .../betterx/betterend/util/LootTableUtil.java | 49 ++++++------------- 2 files changed, 17 insertions(+), 34 deletions(-) diff --git a/build.gradle b/build.gradle index a0d17eb8..2c218f87 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,7 @@ loom { accessWidenerPath = file("src/main/resources/betterend.accesswidener") interfaceInjection { // When enabled injected interfaces from dependecies will be applied. - enableDependencyInterfaceInjection = false + enableDependencyInterfaceInjection = true } } diff --git a/src/main/java/org/betterx/betterend/util/LootTableUtil.java b/src/main/java/org/betterx/betterend/util/LootTableUtil.java index c9fd1c8b..1cd56b23 100644 --- a/src/main/java/org/betterx/betterend/util/LootTableUtil.java +++ b/src/main/java/org/betterx/betterend/util/LootTableUtil.java @@ -1,18 +1,5 @@ package org.betterx.betterend.util; -import net.minecraft.advancements.critereon.EntityPredicate; -import net.minecraft.advancements.critereon.FishingHookPredicate; -import net.minecraft.advancements.critereon.LocationPredicate; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.storage.loot.BuiltInLootTables; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.entries.LootTableReference; -import net.minecraft.world.level.storage.loot.functions.EnchantWithLevelsFunction; -import net.minecraft.world.level.storage.loot.functions.SetItemDamageFunction; -import net.minecraft.world.level.storage.loot.predicates.LocationCheck; -import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraft.world.level.storage.loot.predicates.LootItemEntityPropertyCondition; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; import org.betterx.bclib.complexmaterials.WoodenComplexMaterial; @@ -21,21 +8,29 @@ import org.betterx.betterend.registry.EndBiomes; import org.betterx.betterend.registry.EndBlocks; import org.betterx.betterend.registry.EndItems; +import net.minecraft.advancements.critereon.LocationPredicate; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraft.world.level.storage.loot.BuiltInLootTables; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.entries.LootTableReference; +import net.minecraft.world.level.storage.loot.functions.EnchantWithLevelsFunction; +import net.minecraft.world.level.storage.loot.functions.SetItemDamageFunction; +import net.minecraft.world.level.storage.loot.predicates.LocationCheck; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.fabricmc.fabric.api.loot.v2.LootTableEvents; public class LootTableUtil { - private static final ResourceLocation END_CITY_TREASURE_ID = new ResourceLocation("chests/end_city_treasure"); private static final ResourceLocation COMMON = BetterEnd.makeID("chests/common"); private static final ResourceLocation FOGGY_MUSHROOMLAND = BetterEnd.makeID("chests/foggy_mushroomland"); private static final ResourceLocation CHORUS_FOREST = BetterEnd.makeID("chests/chorus_forest"); @@ -73,7 +68,7 @@ public class LootTableUtil { public static void init() { LootTableEvents.MODIFY.register((resourceManager, lootManager, id, table, setter) -> { - if (END_CITY_TREASURE_ID.equals(id)) { + if (BuiltInLootTables.END_CITY_TREASURE.equals(id)) { LootPool.Builder builder = LootPool.lootPool(); builder.setRolls(ConstantValue.exactly(1)); builder.when(LootItemRandomChanceCondition.randomChance(0.2f)); @@ -87,6 +82,12 @@ public class LootTableUtil { builder.add(LootItem.lootTableItem(EndItems.MUSIC_DISC_ENDSEEKER)); builder.add(LootItem.lootTableItem(EndItems.MUSIC_DISC_EO_DRACONA)); table.withPool(builder); + } else if (BuiltInLootTables.FISHING.equals(id)) { + table.modifyPools((modifier) -> modifier.when(IN_END.invert())); + table.withPool(LootPool.lootPool().when(IN_END).setRolls(ConstantValue.exactly(1.0F)) + .add(LootTableReference.lootTableReference(FISHING_FISH).setWeight(85).setQuality(-1)) + .add(LootTableReference.lootTableReference(FISHING_TREASURE).setWeight(5).setQuality(2)) + .add(LootTableReference.lootTableReference(FISHING_JUNK).setWeight(10).setQuality(-2))); } else if (id.getNamespace().equals(BetterEnd.MOD_ID)) { if (FISHING_FISH.equals(id)) { LootPool.Builder builder = LootPool.lootPool() @@ -159,24 +160,6 @@ public class LootTableUtil { } } }); - - LootTableEvents.REPLACE.register((resourceManager, lootManager, id, originalTable, setter) -> { - if (BuiltInLootTables.FISHING.equals(id)) { - LootTable.Builder builder = LootTable.lootTable() - .withPool(LootPool.lootPool().when(IN_END.invert()).setRolls(ConstantValue.exactly(1.0F)) - .add(LootTableReference.lootTableReference(BuiltInLootTables.FISHING_JUNK).setWeight(10).setQuality(-2)) - .add(LootTableReference.lootTableReference(BuiltInLootTables.FISHING_TREASURE).setWeight(5).setQuality(2) - .when(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, - EntityPredicate.Builder.entity().subPredicate(FishingHookPredicate.inOpenWater(true))))) - .add(LootTableReference.lootTableReference(BuiltInLootTables.FISHING_FISH).setWeight(85).setQuality(-1))) - .withPool(LootPool.lootPool().when(IN_END).setRolls(ConstantValue.exactly(1.0F)) - .add(LootTableReference.lootTableReference(FISHING_FISH).setWeight(85).setQuality(-1)) - .add(LootTableReference.lootTableReference(FISHING_TREASURE).setWeight(5).setQuality(2)) - .add(LootTableReference.lootTableReference(FISHING_JUNK).setWeight(10).setQuality(-2))); - return builder.build(); - } - return null; - }); } public static ResourceLocation getTable(Holder biome) { From 105f8cd8627433c5604c08319fdf232c24840693 Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Thu, 27 Oct 2022 02:38:05 +0200 Subject: [PATCH 07/13] Krypton infusion pedestal fix --- .../java/org/betterx/betterend/blocks/InfusionPedestal.java | 2 +- .../betterend/blocks/entities/InfusionPedestalEntity.java | 6 ++++-- .../java/org/betterx/betterend/rituals/InfusionRitual.java | 5 ++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/betterx/betterend/blocks/InfusionPedestal.java b/src/main/java/org/betterx/betterend/blocks/InfusionPedestal.java index 49e500b4..ca04431b 100644 --- a/src/main/java/org/betterx/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/org/betterx/betterend/blocks/InfusionPedestal.java @@ -84,7 +84,7 @@ public class InfusionPedestal extends PedestalBlock { BlockState blockState, BlockEntityType blockEntityType ) { - return InfusionPedestalEntity::tickEnity; + return InfusionPedestalEntity::tickEntity; } static { diff --git a/src/main/java/org/betterx/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/org/betterx/betterend/blocks/entities/InfusionPedestalEntity.java index bc1d952e..c1896f2c 100644 --- a/src/main/java/org/betterx/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/org/betterx/betterend/blocks/entities/InfusionPedestalEntity.java @@ -52,13 +52,15 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { protected void fromTag(CompoundTag tag) { super.fromTag(tag); if (tag.contains("ritual")) { - linkedRitual = new InfusionRitual(this, level, worldPosition); + if (!hasRitual()) { + linkedRitual = new InfusionRitual(this, level, worldPosition); + } linkedRitual.fromTag(tag.getCompound("ritual")); linkedRitual.configure(); } } - public static void tickEnity( + public static void tickEntity( Level level, BlockPos blockPos, BlockState blockState, diff --git a/src/main/java/org/betterx/betterend/rituals/InfusionRitual.java b/src/main/java/org/betterx/betterend/rituals/InfusionRitual.java index 353de131..6077fa30 100644 --- a/src/main/java/org/betterx/betterend/rituals/InfusionRitual.java +++ b/src/main/java/org/betterx/betterend/rituals/InfusionRitual.java @@ -16,6 +16,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.chunk.LevelChunk.EntityCreationType; import net.minecraft.world.phys.Vec3; import java.awt.*; @@ -56,7 +57,9 @@ public class InfusionRitual implements Container { for (int i = 0; i < catalysts.length; i++) { Point point = PEDESTALS_MAP[i]; MutableBlockPos checkPos = worldPos.mutable().move(Direction.EAST, point.x).move(Direction.NORTH, point.y); - BlockEntity catalystEntity = world.getBlockEntity(checkPos); + BlockEntity catalystEntity = world.isClientSide + ? world.getChunkAt(checkPos).getBlockEntity(checkPos, EntityCreationType.CHECK) + : world.getBlockEntity(checkPos); if (catalystEntity instanceof PedestalBlockEntity) { catalysts[i] = (PedestalBlockEntity) catalystEntity; } else { From d1572b4a77ca9d4b6506e5365c80a02e5e4e3ba7 Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Thu, 27 Oct 2022 03:30:33 +0200 Subject: [PATCH 08/13] Replaced aeternium items with terminite. Added Hydralux petal. --- .../java/org/betterx/betterend/util/LootTableUtil.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/betterx/betterend/util/LootTableUtil.java b/src/main/java/org/betterx/betterend/util/LootTableUtil.java index 1cd56b23..bb35e835 100644 --- a/src/main/java/org/betterx/betterend/util/LootTableUtil.java +++ b/src/main/java/org/betterx/betterend/util/LootTableUtil.java @@ -100,14 +100,15 @@ public class LootTableUtil { .add(LootItem.lootTableItem(Items.ENDER_PEARL)) .add(LootItem.lootTableItem(Items.CHORUS_FRUIT)) .add(LootItem.lootTableItem(EndItems.GELATINE)) - .add(LootItem.lootTableItem(EndItems.CRYSTAL_SHARDS)); + .add(LootItem.lootTableItem(EndItems.CRYSTAL_SHARDS)) + .add(LootItem.lootTableItem(EndItems.HYDRALUX_PETAL).when(IN_SULPHUR_SPRINGS)); addCharnia(builder); table.withPool(builder); return; } else if (FISHING_TREASURE.equals(id)) { LootPool.Builder builder = LootPool.lootPool() - .add(LootItem.lootTableItem(EndItems.AETERNIUM_SWORD_BLADE)) - .add(LootItem.lootTableItem(EndItems.AETERNIUM_FORGED_PLATE)) + .add(LootItem.lootTableItem(EndBlocks.TERMINITE.swordBlade)) + .add(LootItem.lootTableItem(EndBlocks.TERMINITE.forgedPlate)) .add(LootItem.lootTableItem(EndBlocks.MENGER_SPONGE)) .add(LootItem.lootTableItem(Items.BOW) .apply(SetItemDamageFunction.setDamage(UniformGenerator.between(0.0F, 0.25F))) From a417d42a9e583173cad4b09666358620877cc5a3 Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Thu, 27 Oct 2022 03:55:37 +0200 Subject: [PATCH 09/13] Added Smaragdant Crystal recipe --- .../java/org/betterx/betterend/recipe/CraftingRecipes.java | 6 ++++++ .../resources/assets/emi/recipe/defaults/betterend.json | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java b/src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java index 1a692154..4f05c479 100644 --- a/src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java @@ -489,6 +489,12 @@ public class CraftingRecipes { .setOutputCount(4) .addMaterial('#', EndBlocks.DRAGON_BONE_BLOCK) .build(); + + BCLRecipeBuilder.crafting(BetterEnd.makeID("smaragdant_block"), EndBlocks.SMARAGDANT_CRYSTAL) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', EndBlocks.SMARAGDANT_CRYSTAL_SHARD) + .build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/resources/assets/emi/recipe/defaults/betterend.json b/src/main/resources/assets/emi/recipe/defaults/betterend.json index b8f4cd5a..dc0c6e92 100644 --- a/src/main/resources/assets/emi/recipe/defaults/betterend.json +++ b/src/main/resources/assets/emi/recipe/defaults/betterend.json @@ -349,6 +349,7 @@ "betterend:aeternium_ingot", "betterend:sulphuric_rock_flower_pot", "betterend:umbrella_tree_gate", - "betterend:jellyshroom_composter" + "betterend:jellyshroom_composter", + "betterend:smaragdant_crystal" ] } \ No newline at end of file From 75838ff923f9a21bda50c02883dada6077c96be7 Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Thu, 27 Oct 2022 13:23:08 +0200 Subject: [PATCH 10/13] Rename recipe --- src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java b/src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java index 4f05c479..55bd751a 100644 --- a/src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/org/betterx/betterend/recipe/CraftingRecipes.java @@ -490,7 +490,7 @@ public class CraftingRecipes { .addMaterial('#', EndBlocks.DRAGON_BONE_BLOCK) .build(); - BCLRecipeBuilder.crafting(BetterEnd.makeID("smaragdant_block"), EndBlocks.SMARAGDANT_CRYSTAL) + BCLRecipeBuilder.crafting(BetterEnd.makeID("smaragdant_crystal"), EndBlocks.SMARAGDANT_CRYSTAL) .checkConfig(Configs.RECIPE_CONFIG) .setShape("##", "##") .addMaterial('#', EndBlocks.SMARAGDANT_CRYSTAL_SHARD) From 2218be75a93eb7c08f58b42911dd0ae83ab107cb Mon Sep 17 00:00:00 2001 From: Necrontyr Date: Wed, 2 Nov 2022 01:40:09 +0100 Subject: [PATCH 11/13] Disabling end entities fix. --- .../betterend/blocks/SilkMothHiveBlock.java | 4 +-- .../betterend/blocks/SilkMothNestBlock.java | 4 +-- .../betterend/entity/DragonflyEntity.java | 2 +- .../betterend/entity/SilkMothEntity.java | 2 +- .../betterend/registry/EndEntities.java | 26 +++++++++---------- .../registry/EndEntitiesRenders.java | 12 ++++----- .../betterx/betterend/registry/EndItems.java | 4 +-- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/betterx/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/org/betterx/betterend/blocks/SilkMothHiveBlock.java index 5b0ace24..dbe47b65 100644 --- a/src/main/java/org/betterx/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/org/betterx/betterend/blocks/SilkMothHiveBlock.java @@ -82,13 +82,13 @@ public class SilkMothHiveBlock extends BaseBlock { if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { + int count = world.getEntities(EndEntities.SILK_MOTH.type(), new AABB(pos).inflate(16), (entity) -> { return true; }).size(); if (count > 6) { return; } - SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); + SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH.type(), world); moth.moveTo(spawn.getX() + 0.5, spawn.getY() + 0.5, spawn.getZ() + 0.5, dir.toYRot(), 0); moth.setDeltaMovement(new Vec3(dir.getStepX() * 0.4, 0, dir.getStepZ() * 0.4)); moth.setHive(world, pos); diff --git a/src/main/java/org/betterx/betterend/blocks/SilkMothNestBlock.java b/src/main/java/org/betterx/betterend/blocks/SilkMothNestBlock.java index 76d79fa4..8be202b5 100644 --- a/src/main/java/org/betterx/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/org/betterx/betterend/blocks/SilkMothNestBlock.java @@ -149,13 +149,13 @@ public class SilkMothNestBlock extends BaseBlock implements RenderLayerProvider if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { + int count = world.getEntities(EndEntities.SILK_MOTH.type(), new AABB(pos).inflate(16), (entity) -> { return true; }).size(); if (count > 6) { return; } - SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH, world); + SilkMothEntity moth = new SilkMothEntity(EndEntities.SILK_MOTH.type(), world); moth.moveTo(spawn.getX() + 0.5, spawn.getY() + 0.5, spawn.getZ() + 0.5, dir.toYRot(), 0); moth.setDeltaMovement(new Vec3(dir.getStepX() * 0.4, 0, dir.getStepZ() * 0.4)); moth.setHive(world, pos); diff --git a/src/main/java/org/betterx/betterend/entity/DragonflyEntity.java b/src/main/java/org/betterx/betterend/entity/DragonflyEntity.java index cbd5a882..f7f52894 100644 --- a/src/main/java/org/betterx/betterend/entity/DragonflyEntity.java +++ b/src/main/java/org/betterx/betterend/entity/DragonflyEntity.java @@ -209,6 +209,6 @@ public class DragonflyEntity extends DespawnableAnimal implements FlyingAnimal { @Override public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { - return EndEntities.DRAGONFLY.create(world); + return EndEntities.DRAGONFLY.type().create(world); } } diff --git a/src/main/java/org/betterx/betterend/entity/SilkMothEntity.java b/src/main/java/org/betterx/betterend/entity/SilkMothEntity.java index 6e58e229..ca0f964b 100644 --- a/src/main/java/org/betterx/betterend/entity/SilkMothEntity.java +++ b/src/main/java/org/betterx/betterend/entity/SilkMothEntity.java @@ -155,7 +155,7 @@ public class SilkMothEntity extends DespawnableAnimal implements FlyingAnimal { @Override public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { - return EndEntities.SILK_MOTH.create(world); + return EndEntities.SILK_MOTH.type().create(world); } @Override diff --git a/src/main/java/org/betterx/betterend/registry/EndEntities.java b/src/main/java/org/betterx/betterend/registry/EndEntities.java index e101d79a..3f2de03f 100644 --- a/src/main/java/org/betterx/betterend/registry/EndEntities.java +++ b/src/main/java/org/betterx/betterend/registry/EndEntities.java @@ -1,6 +1,7 @@ package org.betterx.betterend.registry; import org.betterx.bclib.api.v2.spawning.SpawnRuleBuilder; +import org.betterx.bclib.entity.BCLEntityWrapper; import org.betterx.betterend.BetterEnd; import org.betterx.betterend.config.Configs; import org.betterx.betterend.entity.*; @@ -17,7 +18,7 @@ import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRe import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; public class EndEntities { - public static final EntityType DRAGONFLY = register( + public static final BCLEntityWrapper DRAGONFLY = register( "dragonfly", MobCategory.AMBIENT, 0.6F, @@ -28,7 +29,7 @@ public class EndEntities { ColorUtil.color(32, 42, 176), ColorUtil.color(115, 225, 249) ); - public static final EntityType END_SLIME = register( + public static final BCLEntityWrapper END_SLIME = register( "end_slime", MobCategory.MONSTER, 2F, @@ -39,7 +40,7 @@ public class EndEntities { ColorUtil.color(28, 28, 28), ColorUtil.color(99, 11, 99) ); - public static final EntityType END_FISH = register( + public static final BCLEntityWrapper END_FISH = register( "end_fish", MobCategory.WATER_AMBIENT, 0.5F, @@ -50,7 +51,7 @@ public class EndEntities { ColorUtil.color(3, 50, 76), ColorUtil.color(120, 206, 255) ); - public static final EntityType SHADOW_WALKER = register( + public static final BCLEntityWrapper SHADOW_WALKER = register( "shadow_walker", MobCategory.MONSTER, 0.6F, @@ -61,7 +62,7 @@ public class EndEntities { ColorUtil.color(30, 30, 30), ColorUtil.color(5, 5, 5) ); - public static final EntityType CUBOZOA = register( + public static final BCLEntityWrapper CUBOZOA = register( "cubozoa", MobCategory.WATER_AMBIENT, 0.6F, @@ -72,7 +73,7 @@ public class EndEntities { ColorUtil.color(151, 77, 181), ColorUtil.color(93, 176, 238) ); - public static final EntityType SILK_MOTH = register( + public static final BCLEntityWrapper SILK_MOTH = register( "silk_moth", MobCategory.AMBIENT, 0.6F, @@ -127,7 +128,7 @@ public class EndEntities { return type; } - private static EntityType register( + private static BCLEntityWrapper register( String name, MobCategory group, float width, @@ -145,11 +146,10 @@ public class EndEntities { ? EntityDimensions.fixed(width, height) : EntityDimensions.scalable(width, height)) .build(); - if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { - FabricDefaultAttributeRegistry.register(type, attributes); - EndItems.registerEndEgg("spawn_egg_" + name, type, eggColor, dotsColor); - return Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), type); - } - return type; + FabricDefaultAttributeRegistry.register(type, attributes); + EndItems.registerEndEgg("spawn_egg_" + name, type, eggColor, dotsColor); + Registry.register(Registry.ENTITY_TYPE, BetterEnd.makeID(name), type); + + return new BCLEntityWrapper<>(type, Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)); } } diff --git a/src/main/java/org/betterx/betterend/registry/EndEntitiesRenders.java b/src/main/java/org/betterx/betterend/registry/EndEntitiesRenders.java index e168eac2..67bd552d 100644 --- a/src/main/java/org/betterx/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/org/betterx/betterend/registry/EndEntitiesRenders.java @@ -32,12 +32,12 @@ public class EndEntitiesRenders { public static final ModelLayerLocation CRYSTALITE_BOOTS = registerMain("crystalite_boots"); public static void register() { - register(EndEntities.DRAGONFLY, RendererEntityDragonfly::new); - register(EndEntities.END_SLIME, RendererEntityEndSlime::new); - register(EndEntities.END_FISH, RendererEntityEndFish::new); - register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker::new); - register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); - register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); + register(EndEntities.DRAGONFLY.type(), RendererEntityDragonfly::new); + register(EndEntities.END_SLIME.type(), RendererEntityEndSlime::new); + register(EndEntities.END_FISH.type(), RendererEntityEndFish::new); + register(EndEntities.SHADOW_WALKER.type(), RendererEntityShadowWalker::new); + register(EndEntities.CUBOZOA.type(), RendererEntityCubozoa::new); + register(EndEntities.SILK_MOTH.type(), SilkMothEntityRenderer::new); EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, DragonflyEntityModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer( diff --git a/src/main/java/org/betterx/betterend/registry/EndItems.java b/src/main/java/org/betterx/betterend/registry/EndItems.java index 3104d525..7d36db19 100644 --- a/src/main/java/org/betterx/betterend/registry/EndItems.java +++ b/src/main/java/org/betterx/betterend/registry/EndItems.java @@ -277,9 +277,9 @@ public class EndItems { public final static Item END_FISH_COOKED = registerEndFood("end_fish_cooked", Foods.COOKED_SALMON); public final static Item BUCKET_END_FISH = registerEndItem( "bucket_end_fish", - new EndBucketItem(EndEntities.END_FISH) + new EndBucketItem(EndEntities.END_FISH.type()) ); - public final static Item BUCKET_CUBOZOA = registerEndItem("bucket_cubozoa", new EndBucketItem(EndEntities.CUBOZOA)); + public final static Item BUCKET_CUBOZOA = registerEndItem("bucket_cubozoa", new EndBucketItem(EndEntities.CUBOZOA.type())); public final static Item SWEET_BERRY_JELLY = registerEndFood("sweet_berry_jelly", 8, 0.7F); public final static Item SHADOW_BERRY_JELLY = registerEndFood( "shadow_berry_jelly", From ba2bd1490ccf5871d8b87ccdd213c9cca62399ad Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 18 Nov 2022 18:32:49 +0100 Subject: [PATCH 12/13] [Changes] Use vanilla rules to spread end terrain on endstone using bonemeal --- .../betterx/betterend/registry/EndBlocks.java | 114 ++++++++++++++---- 1 file changed, 91 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/betterx/betterend/registry/EndBlocks.java b/src/main/java/org/betterx/betterend/registry/EndBlocks.java index 46387888..ce94c372 100644 --- a/src/main/java/org/betterx/betterend/registry/EndBlocks.java +++ b/src/main/java/org/betterx/betterend/registry/EndBlocks.java @@ -1,5 +1,6 @@ package org.betterx.betterend.registry; +import org.betterx.bclib.api.v3.tag.BCLBlockTags; import org.betterx.bclib.blocks.*; import org.betterx.bclib.registry.BlockRegistry; import org.betterx.betterend.BetterEnd; @@ -10,8 +11,11 @@ import org.betterx.betterend.config.Configs; import org.betterx.betterend.item.material.EndArmorMaterial; import org.betterx.betterend.item.material.EndToolMaterial; import org.betterx.betterend.tab.CreativeTabs; +import org.betterx.worlds.together.tag.v3.TagManager; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -30,41 +34,89 @@ public class EndBlocks { "end_mycelium", new EndTerrainBlock(MaterialColor.COLOR_LIGHT_BLUE) ); - public static final Block END_MOSS = registerBlock("end_moss", new EndTerrainBlock(MaterialColor.COLOR_CYAN)); + public static final Block END_MOSS = registerBlock( + "end_moss", + new EndTerrainBlock(MaterialColor.COLOR_CYAN), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM + ); public static final Block CHORUS_NYLIUM = registerBlock( "chorus_nylium", - new EndTerrainBlock(MaterialColor.COLOR_MAGENTA) + new EndTerrainBlock(MaterialColor.COLOR_MAGENTA), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM + ); + public static final Block CAVE_MOSS = registerBlock( + "cave_moss", + new EndTripleTerrain(MaterialColor.COLOR_PURPLE), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM ); - public static final Block CAVE_MOSS = registerBlock("cave_moss", new EndTripleTerrain(MaterialColor.COLOR_PURPLE)); public static final Block CRYSTAL_MOSS = registerBlock( "crystal_moss", - new EndTerrainBlock(MaterialColor.COLOR_PINK) + new EndTerrainBlock(MaterialColor.COLOR_PINK), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM ); - public static final Block CRYSTAL_MOSS_COVER = registerBlock( - "crystal_moss_cover", - new CrystalMossCoverBlock(MaterialColor.COLOR_PINK) + public static final Block SHADOW_GRASS = registerBlock( + "shadow_grass", + new ShadowGrassBlock(), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM + ); + public static final Block PINK_MOSS = registerBlock( + "pink_moss", + new EndTerrainBlock(MaterialColor.COLOR_PINK), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM + ); + public static final Block AMBER_MOSS = registerBlock( + "amber_moss", + new EndTerrainBlock(MaterialColor.COLOR_ORANGE), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM ); - public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new ShadowGrassBlock()); - public static final Block PINK_MOSS = registerBlock("pink_moss", new EndTerrainBlock(MaterialColor.COLOR_PINK)); - public static final Block AMBER_MOSS = registerBlock("amber_moss", new EndTerrainBlock(MaterialColor.COLOR_ORANGE)); public static final Block JUNGLE_MOSS = registerBlock( "jungle_moss", - new EndTerrainBlock(MaterialColor.COLOR_GREEN) + new EndTerrainBlock(MaterialColor.COLOR_GREEN), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM + ); + public static final Block SANGNUM = registerBlock( + "sangnum", + new EndTerrainBlock(MaterialColor.COLOR_RED), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM + ); + public static final Block RUTISCUS = registerBlock( + "rutiscus", + new EndTerrainBlock(MaterialColor.COLOR_ORANGE), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM + ); + public static final Block PALLIDIUM_FULL = registerBlock( + "pallidium_full", + new PallidiumBlock("full", null), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM ); - public static final Block SANGNUM = registerBlock("sangnum", new EndTerrainBlock(MaterialColor.COLOR_RED)); - public static final Block RUTISCUS = registerBlock("rutiscus", new EndTerrainBlock(MaterialColor.COLOR_ORANGE)); - public static final Block PALLIDIUM_FULL = registerBlock("pallidium_full", new PallidiumBlock("full", null)); public static final Block PALLIDIUM_HEAVY = registerBlock( "pallidium_heavy", - new PallidiumBlock("heavy", PALLIDIUM_FULL) + new PallidiumBlock("heavy", PALLIDIUM_FULL), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM ); public static final Block PALLIDIUM_THIN = registerBlock( "pallidium_thin", - new PallidiumBlock("thin", PALLIDIUM_HEAVY) + new PallidiumBlock("thin", PALLIDIUM_HEAVY), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM ); public static final Block PALLIDIUM_TINY = registerBlock( "pallidium_tiny", - new PallidiumBlock("tiny", PALLIDIUM_THIN) + new PallidiumBlock("tiny", PALLIDIUM_THIN), + BCLBlockTags.BONEMEAL_SOURCE_END_STONE, + BlockTags.NYLIUM ); // Roads // @@ -83,10 +135,15 @@ public class EndBlocks { public static final Block SANGNUM_PATH = registerBlock("sangnum_path", new BasePathBlock(SANGNUM)); public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new BasePathBlock(RUTISCUS)); - public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); + public static final Block MOSSY_OBSIDIAN = registerBlock( + "mossy_obsidian", + new MossyObsidian(), + BCLBlockTags.BONEMEAL_SOURCE_OBSIDIAN + ); public static final Block DRAGON_BONE_BLOCK = registerBlock( "dragon_bone_block", - new BaseRotatedPillarBlock(Blocks.BONE_BLOCK) + new BaseRotatedPillarBlock(Blocks.BONE_BLOCK), + EndTags.BONEMEAL_TARGET_DRAGON_BONE ); public static final Block DRAGON_BONE_STAIRS = registerBlock( "dragon_bone_stairs", @@ -96,7 +153,11 @@ public class EndBlocks { "dragon_bone_slab", new BaseSlabBlock(DRAGON_BONE_BLOCK) ); - public static final Block MOSSY_DRAGON_BONE = registerBlock("mossy_dragon_bone", new MossyDragonBoneBlock()); + public static final Block MOSSY_DRAGON_BONE = registerBlock( + "mossy_dragon_bone", + new MossyDragonBoneBlock(), + EndTags.BONEMEAL_SOURCE_DRAGON_BONE + ); // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); @@ -382,6 +443,12 @@ public class EndBlocks { ); public static final Block FLAMMALIX = registerBlock("flammalix", new FlammalixBlock()); + + public static final Block CRYSTAL_MOSS_COVER = registerBlock( + "crystal_moss_cover", + new CrystalMossCoverBlock(MaterialColor.COLOR_PINK) + ); + public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerEndBlockOnly("blue_vine", new BlueVineBlock()); public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlueVineLanternBlock()); @@ -635,16 +702,17 @@ public class EndBlocks { return BlockRegistry.getModBlockItems(BetterEnd.MOD_ID); } - public static Block registerBlock(ResourceLocation id, Block block) { + public static Block registerBlock(ResourceLocation id, Block block, TagKey... tags) { if (!Configs.BLOCK_CONFIG.getBooleanRoot(id.getPath(), true)) { return block; } getBlockRegistry().register(id, block); + TagManager.BLOCKS.add(block, tags); return block; } - public static Block registerBlock(String name, Block block) { - return registerBlock(BetterEnd.makeID(name), block); + public static Block registerBlock(String name, Block block, TagKey... tags) { + return registerBlock(BetterEnd.makeID(name), block, tags); } public static Block registerEndBlockOnly(String name, Block block) { From 308065dee1a9805df2e3651fb2a64c7909455476 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 18 Nov 2022 18:33:09 +0100 Subject: [PATCH 13/13] [Changes] Use vanilla rules to spread flowers/grass when bonemealing end blocks --- .../betterend/registry/EndFeatures.java | 132 ++++++++++- .../betterx/betterend/registry/EndTags.java | 15 +- .../betterend/util/BonemealPlants.java | 205 ++++++++++++------ 3 files changed, 274 insertions(+), 78 deletions(-) diff --git a/src/main/java/org/betterx/betterend/registry/EndFeatures.java b/src/main/java/org/betterx/betterend/registry/EndFeatures.java index 9a487cce..259d99ee 100644 --- a/src/main/java/org/betterx/betterend/registry/EndFeatures.java +++ b/src/main/java/org/betterx/betterend/registry/EndFeatures.java @@ -7,6 +7,8 @@ import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature; import org.betterx.bclib.api.v3.levelgen.features.BCLFeature; import org.betterx.bclib.api.v3.levelgen.features.BCLFeatureBuilder; +import org.betterx.bclib.api.v3.levelgen.features.config.ConditionFeatureConfig; +import org.betterx.bclib.api.v3.levelgen.features.placement.InBiome; import org.betterx.bclib.util.JsonFactory; import org.betterx.betterend.BetterEnd; import org.betterx.betterend.complexmaterials.StoneMaterial; @@ -32,11 +34,10 @@ import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.OreFeature; -import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; -import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; +import net.minecraft.world.level.levelgen.feature.RandomPatchFeature; +import net.minecraft.world.level.levelgen.feature.configurations.*; import net.minecraft.world.level.levelgen.feature.stateproviders.SimpleStateProvider; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; import com.google.common.collect.Lists; import com.google.gson.JsonArray; @@ -1047,6 +1048,129 @@ public class EndFeatures { .buildAndRegister(); + private static final Holder BONEMEAL_END_MOSS_NOT_GLOWING_GRASSLANDS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_end_moss_not_glowing_grasslands")) + .add(EndBlocks.CREEPING_MOSS, 10) + .add(EndBlocks.UMBRELLA_MOSS, 10) + .inlinePlace().build(); + + private static final Holder BONEMEAL_END_MOSS_GLOWING_GRASSLANDS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_end_moss_glowing_grasslands")) + .add(EndBlocks.CREEPING_MOSS, 10) + .add(EndBlocks.UMBRELLA_MOSS, 10) + .add(EndBlocks.BLOOMING_COOKSONIA, 100) + .add(EndBlocks.VAIOLUSH_FERN, 100) + .add(EndBlocks.FRACTURN, 100) + .add(EndBlocks.SALTEAGO, 100) + .add(EndBlocks.TWISTED_UMBRELLA_MOSS, 10) + .inlinePlace().build(); + + public static final BCLConfigureFeature, ConditionFeatureConfig> BONEMEAL_END_MOSS = BCLFeatureBuilder + .start( + BetterEnd.makeID("bonemeal_end_moss"), + BCLFeature.CONDITION + ) + .configuration(new ConditionFeatureConfig( + InBiome.matchingID(EndBiomes.GLOWING_GRASSLANDS.getID()), + BONEMEAL_END_MOSS_GLOWING_GRASSLANDS, + BONEMEAL_END_MOSS_NOT_GLOWING_GRASSLANDS + )) + .buildAndRegister(); + + private static final Holder BONEMEAL_RUTISCUS_NOT_LANTERN_WOODS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_rutiscus_not_lantern_woods")) + .add(EndBlocks.ORANGO, 100) + .add(EndBlocks.AERIDIUM, 20) + .add(EndBlocks.LUTEBUS, 20) + .add(EndBlocks.LAMELLARIUM, 100) + .inlinePlace() + .build(); + + private static final Holder BONEMEAL_RUTISCUS_LANTERN_WOODS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_rutiscus_lantern_woods")) + .add(EndBlocks.AERIDIUM, 20) + .add(EndBlocks.BOLUX_MUSHROOM, 5) + .add(EndBlocks.LAMELLARIUM, 100) + .inlinePlace() + .build(); + + public static final BCLConfigureFeature, ConditionFeatureConfig> BONEMEAL_RUTISCUS = BCLFeatureBuilder + .start( + BetterEnd.makeID("bonemeal_rutiscus"), + BCLFeature.CONDITION + ) + .configuration(new ConditionFeatureConfig( + InBiome.matchingID(EndBiomes.LANTERN_WOODS.getID()), + BONEMEAL_RUTISCUS_LANTERN_WOODS, + BONEMEAL_RUTISCUS_NOT_LANTERN_WOODS + )) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_END_MYCELIUM = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_end_mycelium")) + .add(EndBlocks.CREEPING_MOSS, 100) + .add(EndBlocks.UMBRELLA_MOSS, 100) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_JUNGLE_MOSS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_jungle_moss")) + .add(EndBlocks.JUNGLE_GRASS, 100) + .add(EndBlocks.TWISTED_UMBRELLA_MOSS, 100) + .add(EndBlocks.SMALL_JELLYSHROOM, 10) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_SANGNUM = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_sangnum")) + .add(EndBlocks.CLAWFERN, 100) + .add(EndBlocks.GLOBULAGUS, 100) + .add(EndBlocks.SMALL_AMARANITA_MUSHROOM, 10) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_MOSSY_DRAGON_BONE = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_mossy_dragon_bone")) + .add(EndBlocks.CLAWFERN, 100) + .add(EndBlocks.GLOBULAGUS, 100) + .add(EndBlocks.SMALL_AMARANITA_MUSHROOM, 10) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_MOSSY_OBSIDIAN = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_mossy_obsidian")) + .add(EndBlocks.CLAWFERN, 100) + .add(EndBlocks.GLOBULAGUS, 100) + .add(EndBlocks.SMALL_AMARANITA_MUSHROOM, 10) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_CAVE_MOSS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_cave_moss")) + .add(EndBlocks.CAVE_GRASS, 100) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_CHORUS_NYLIUM = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_chorus_nylium")) + .add(EndBlocks.CHORUS_GRASS, 100) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_CRYSTAL_MOSS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_crystal_moss")) + .add(EndBlocks.CRYSTAL_GRASS, 100) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_SHADOW_GRASS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_shadow_grass")) + .add(EndBlocks.SHADOW_PLANT, 100) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_PINK_MOSS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_pink_moss")) + .add(EndBlocks.BUSHY_GRASS, 100) + .buildAndRegister(); + + public static final BCLConfigureFeature BONEMEAL_AMBER_MOSS = BCLFeatureBuilder + .startBonemealPatch(BetterEnd.makeID("bonemeal_amber_moss")) + .add(EndBlocks.AMBER_GRASS, 100) + .buildAndRegister(); + + public static , FC extends FeatureConfiguration> F inlineBuild(String name, F feature) { ResourceLocation l = BetterEnd.makeID(name); if (Registry.FEATURE.containsKey(l)) { diff --git a/src/main/java/org/betterx/betterend/registry/EndTags.java b/src/main/java/org/betterx/betterend/registry/EndTags.java index 9c6f0c28..3ba41b69 100644 --- a/src/main/java/org/betterx/betterend/registry/EndTags.java +++ b/src/main/java/org/betterx/betterend/registry/EndTags.java @@ -1,6 +1,5 @@ package org.betterx.betterend.registry; -import org.betterx.bclib.api.v2.BonemealAPI; import org.betterx.bclib.api.v2.ComposterAPI; import org.betterx.bclib.blocks.BaseVineBlock; import org.betterx.bclib.blocks.SimpleLeavesBlock; @@ -21,7 +20,6 @@ import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockBehaviour.Properties; import net.minecraft.world.level.material.Material; @@ -45,6 +43,13 @@ public class EndTags { public static final TagKey ALLOYING_GOLD = TagManager.ITEMS.makeTag(BetterEnd.MOD_ID, "alloying_gold"); public static final TagKey ALLOYING_COPPER = TagManager.ITEMS.makeTag(BetterEnd.MOD_ID, "alloying_copper"); + public static final TagKey BONEMEAL_SOURCE_DRAGON_BONE = TagManager.BLOCKS.makeTogetherTag( + "bonemeal/source/dragon_bone" + ); + public static final TagKey BONEMEAL_TARGET_DRAGON_BONE = TagManager.BLOCKS.makeTogetherTag( + "bonemeal/target/dragon_bone" + ); + public static void register() { addEndGround(EndBlocks.THALLASIUM.ore); addEndGround(EndBlocks.ENDSTONE_DUST); @@ -68,8 +73,6 @@ public class EndTags { if (block instanceof EndTerrainBlock) { addEndGround(block); - TagManager.BLOCKS.add(BlockTags.NYLIUM, block); - BonemealAPI.addSpreadableBlock(block, Blocks.END_STONE); } else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { TagManager.BLOCKS.add(BlockTags.LEAVES, block); ComposterAPI.allowCompost(0.3f, item); @@ -85,10 +88,6 @@ public class EndTags { } }); addEndGround(EndBlocks.CAVE_MOSS); - TagManager.BLOCKS.add(BlockTags.NYLIUM, EndBlocks.CAVE_MOSS); - BonemealAPI.addSpreadableBlock(EndBlocks.CAVE_MOSS, Blocks.END_STONE); - BonemealAPI.addSpreadableBlock(EndBlocks.MOSSY_OBSIDIAN, Blocks.OBSIDIAN); - BonemealAPI.addSpreadableBlock(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.DRAGON_BONE_BLOCK); List ITEM_HAMMERS = Lists.newArrayList(); EndItems.getModItems().forEach(item -> { diff --git a/src/main/java/org/betterx/betterend/util/BonemealPlants.java b/src/main/java/org/betterx/betterend/util/BonemealPlants.java index 24e6655e..e2645fa5 100644 --- a/src/main/java/org/betterx/betterend/util/BonemealPlants.java +++ b/src/main/java/org/betterx/betterend/util/BonemealPlants.java @@ -2,8 +2,8 @@ package org.betterx.betterend.util; import org.betterx.bclib.api.v2.BonemealAPI; import org.betterx.betterend.blocks.basis.EndTerrainBlock; -import org.betterx.betterend.registry.EndBiomes; import org.betterx.betterend.registry.EndBlocks; +import org.betterx.betterend.registry.EndFeatures; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -14,82 +14,155 @@ import java.util.List; public class BonemealPlants { public static void init() { - BonemealAPI.addLandGrass(EndBlocks.CREEPING_MOSS, EndBlocks.END_MOSS); - BonemealAPI.addLandGrass(EndBlocks.UMBRELLA_MOSS, EndBlocks.END_MOSS); - BonemealAPI.addLandGrass(EndBlocks.CREEPING_MOSS, EndBlocks.END_MYCELIUM); - BonemealAPI.addLandGrass(EndBlocks.UMBRELLA_MOSS, EndBlocks.END_MYCELIUM); - - BonemealAPI.addLandGrass(EndBlocks.CAVE_GRASS, EndBlocks.CAVE_MOSS); - BonemealAPI.addLandGrass(EndBlocks.CHORUS_GRASS, EndBlocks.CHORUS_NYLIUM); - BonemealAPI.addLandGrass(EndBlocks.CRYSTAL_GRASS, EndBlocks.CRYSTAL_MOSS); - BonemealAPI.addLandGrass(EndBlocks.SHADOW_PLANT, EndBlocks.SHADOW_GRASS); - BonemealAPI.addLandGrass(EndBlocks.BUSHY_GRASS, EndBlocks.PINK_MOSS); - BonemealAPI.addLandGrass(EndBlocks.AMBER_GRASS, EndBlocks.AMBER_MOSS); - - BonemealAPI.addLandGrass(EndBlocks.JUNGLE_GRASS, EndBlocks.JUNGLE_MOSS); - BonemealAPI.addLandGrass(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.JUNGLE_MOSS); - BonemealAPI.addLandGrass(EndBlocks.SMALL_JELLYSHROOM, EndBlocks.JUNGLE_MOSS, 0.1F); - - BonemealAPI.addLandGrass( - EndBiomes.GLOWING_GRASSLANDS.getID(), - EndBlocks.BLOOMING_COOKSONIA, - EndBlocks.END_MOSS - ); - BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.VAIOLUSH_FERN, EndBlocks.END_MOSS); - BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.FRACTURN, EndBlocks.END_MOSS); - BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.SALTEAGO, EndBlocks.END_MOSS); - - BonemealAPI.addLandGrass( - EndBiomes.GLOWING_GRASSLANDS.getID(), - EndBlocks.CREEPING_MOSS, + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( EndBlocks.END_MOSS, - 0.1F - ); - BonemealAPI.addLandGrass( - EndBiomes.GLOWING_GRASSLANDS.getID(), - EndBlocks.UMBRELLA_MOSS, - EndBlocks.END_MOSS, - 0.1F - ); - BonemealAPI.addLandGrass( - EndBiomes.GLOWING_GRASSLANDS.getID(), - EndBlocks.TWISTED_UMBRELLA_MOSS, - EndBlocks.END_MOSS, - 0.1F + EndFeatures.BONEMEAL_END_MOSS ); - BonemealAPI.addLandGrass(EndBlocks.ORANGO, EndBlocks.RUTISCUS); - BonemealAPI.addLandGrass(EndBlocks.AERIDIUM, EndBlocks.RUTISCUS, 0.2F); - BonemealAPI.addLandGrass(EndBlocks.LUTEBUS, EndBlocks.RUTISCUS, 0.2F); - BonemealAPI.addLandGrass(EndBlocks.LAMELLARIUM, EndBlocks.RUTISCUS); + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.RUTISCUS, + EndFeatures.BONEMEAL_RUTISCUS + ); - BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.AERIDIUM, EndBlocks.RUTISCUS, 0.2F); - BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.LAMELLARIUM, EndBlocks.RUTISCUS); - BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.BOLUX_MUSHROOM, EndBlocks.RUTISCUS, 0.05F); + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.END_MYCELIUM, + EndFeatures.BONEMEAL_END_MYCELIUM + ); - BonemealAPI.addLandGrass( - EndBlocks.GLOBULAGUS, + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.JUNGLE_MOSS, + EndFeatures.BONEMEAL_JUNGLE_MOSS + ); + + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( EndBlocks.SANGNUM, - EndBlocks.MOSSY_OBSIDIAN, - EndBlocks.MOSSY_DRAGON_BONE + EndFeatures.BONEMEAL_SANGNUM ); - BonemealAPI.addLandGrass( - EndBlocks.CLAWFERN, - EndBlocks.SANGNUM, + + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( EndBlocks.MOSSY_OBSIDIAN, - EndBlocks.MOSSY_DRAGON_BONE + EndFeatures.BONEMEAL_MOSSY_OBSIDIAN ); - BonemealAPI.addLandGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_OBSIDIAN, 0.1F); - BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_DRAGON_BONE, 0.1F); - BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.MOSSY_DRAGON_BONE); - BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.MOSSY_DRAGON_BONE); - BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_DRAGON_BONE, 0.1F); + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.MOSSY_DRAGON_BONE, + EndFeatures.BONEMEAL_MOSSY_DRAGON_BONE + ); - BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.MOSSY_OBSIDIAN); - BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.MOSSY_OBSIDIAN); - BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_OBSIDIAN, 0.1F); + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.CAVE_MOSS, + EndFeatures.BONEMEAL_CAVE_MOSS + ); + + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.CHORUS_NYLIUM, + EndFeatures.BONEMEAL_CHORUS_NYLIUM + ); + + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.CRYSTAL_MOSS, + EndFeatures.BONEMEAL_CRYSTAL_MOSS + ); + + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.SHADOW_GRASS, + EndFeatures.BONEMEAL_SHADOW_GRASS + ); + + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.PINK_MOSS, + EndFeatures.BONEMEAL_PINK_MOSS + ); + + org.betterx.bclib.api.v3.bonemeal.BonemealAPI.INSTANCE.addSpreadableFeatures( + EndBlocks.AMBER_MOSS, + EndFeatures.BONEMEAL_AMBER_MOSS + ); + + +// BonemealAPI.addLandGrass(EndBlocks.CAVE_GRASS, EndBlocks.CAVE_MOSS); +// +// BonemealAPI.addLandGrass(EndBlocks.CHORUS_GRASS, EndBlocks.CHORUS_NYLIUM); +// +// BonemealAPI.addLandGrass(EndBlocks.CRYSTAL_GRASS, EndBlocks.CRYSTAL_MOSS); +// +// BonemealAPI.addLandGrass(EndBlocks.SHADOW_PLANT, EndBlocks.SHADOW_GRASS); +// +// BonemealAPI.addLandGrass(EndBlocks.BUSHY_GRASS, EndBlocks.PINK_MOSS); +// +// BonemealAPI.addLandGrass(EndBlocks.AMBER_GRASS, EndBlocks.AMBER_MOSS); + +// BonemealAPI.addLandGrass(EndBlocks.CREEPING_MOSS, EndBlocks.END_MOSS); +// BonemealAPI.addLandGrass(EndBlocks.UMBRELLA_MOSS, EndBlocks.END_MOSS); +// +// BonemealAPI.addLandGrass( +// EndBiomes.GLOWING_GRASSLANDS.getID(), +// EndBlocks.BLOOMING_COOKSONIA, +// EndBlocks.END_MOSS +// ); +// BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.VAIOLUSH_FERN, EndBlocks.END_MOSS); +// BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.FRACTURN, EndBlocks.END_MOSS); +// BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.SALTEAGO, EndBlocks.END_MOSS); +// BonemealAPI.addLandGrass( +// EndBiomes.GLOWING_GRASSLANDS.getID(), +// EndBlocks.CREEPING_MOSS, +// EndBlocks.END_MOSS, +// 0.1F +// ); +// BonemealAPI.addLandGrass( +// EndBiomes.GLOWING_GRASSLANDS.getID(), +// EndBlocks.UMBRELLA_MOSS, +// EndBlocks.END_MOSS, +// 0.1F +// ); +// BonemealAPI.addLandGrass( +// EndBiomes.GLOWING_GRASSLANDS.getID(), +// EndBlocks.TWISTED_UMBRELLA_MOSS, +// EndBlocks.END_MOSS, +// 0.1F +// ); + +// BonemealAPI.addLandGrass(EndBlocks.CREEPING_MOSS, EndBlocks.END_MYCELIUM); +// BonemealAPI.addLandGrass(EndBlocks.UMBRELLA_MOSS, EndBlocks.END_MYCELIUM); + + +// BonemealAPI.addLandGrass(EndBlocks.JUNGLE_GRASS, EndBlocks.JUNGLE_MOSS); +// BonemealAPI.addLandGrass(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.JUNGLE_MOSS); +// BonemealAPI.addLandGrass(EndBlocks.SMALL_JELLYSHROOM, EndBlocks.JUNGLE_MOSS, 0.1F); + +// BonemealAPI.addLandGrass(EndBlocks.ORANGO, EndBlocks.RUTISCUS); +// BonemealAPI.addLandGrass(EndBlocks.AERIDIUM, EndBlocks.RUTISCUS, 0.2F); +// BonemealAPI.addLandGrass(EndBlocks.LUTEBUS, EndBlocks.RUTISCUS, 0.2F); +// BonemealAPI.addLandGrass(EndBlocks.LAMELLARIUM, EndBlocks.RUTISCUS); +// +// BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.AERIDIUM, EndBlocks.RUTISCUS, 0.2F); +// BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.LAMELLARIUM, EndBlocks.RUTISCUS); +// BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.BOLUX_MUSHROOM, EndBlocks.RUTISCUS, 0.05F); + +// BonemealAPI.addLandGrass( +// EndBlocks.GLOBULAGUS, +// EndBlocks.SANGNUM, +// EndBlocks.MOSSY_OBSIDIAN, +// EndBlocks.MOSSY_DRAGON_BONE +// ); +// BonemealAPI.addLandGrass( +// EndBlocks.CLAWFERN, +// EndBlocks.SANGNUM, +// EndBlocks.MOSSY_OBSIDIAN, +// EndBlocks.MOSSY_DRAGON_BONE +// ); +// BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.SANGNUM, 0.1F); + + +// BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_DRAGON_BONE, 0.1F); +// BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.MOSSY_DRAGON_BONE); +// BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.MOSSY_DRAGON_BONE); +// BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_DRAGON_BONE, 0.1F); + +// BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_OBSIDIAN, 0.1F); +// BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.MOSSY_OBSIDIAN); +// BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.MOSSY_OBSIDIAN); +// BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_OBSIDIAN, 0.1F); Block[] charnias = new Block[]{ EndBlocks.CHARNIA_CYAN,